其他分享
首页 > 其他分享> > 一种消息接收并打印的结构设计

一种消息接收并打印的结构设计

作者:互联网

链接
已知一个消息流会不断地吐出整数1∼N,但不一定按照顺序吐出。如果上次打印的数为i,那么当i+1出现时,请打印i+1及其之后接收过的并且连续的所有数,直到1∼N全部接收并打印完,请设计这种接收并打印的结构

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int n = in.nextInt();
            MessageBox messageBox = new MessageBox();
            while (n-- > 0) {
                messageBox.receive(in.nextInt());
            }
        }
    }
}

class MessageBox {

    private int wait;

    private Map<Integer, Node> headMap;

    private Map<Integer, Node> tailMap;

    private Map<Integer, Node> nodeMap;

    public MessageBox() {
        this.wait = 1;
        this.headMap = new HashMap<>();
        this.tailMap = new HashMap<>();
        this.nodeMap = new HashMap<>();
    }


    private Node addNode(int value) {
        Node node = new Node(null, value);
        headMap.put(value, node);
        tailMap.put(value, node);
        nodeMap.put(value, node);
        return node;
    }

    public void receive(int value) {

        Node newNode = addNode(value);

        if (tailMap.containsKey(value - 1)) {
            tailMap.get(value - 1).next = newNode;
            tailMap.remove(value - 1);
            headMap.remove(value);
        }

        if (headMap.containsKey(value + 1)) {
            newNode.next = headMap.get(value + 1);
            tailMap.remove(value);
            headMap.remove(value + 1);
        }

        tryPrint(value);
    }

    private void remove(int value) {
        headMap.remove(value);
        tailMap.remove(value);
        nodeMap.remove(value);
    }

    private void tryPrint(int value) {
        if (this.wait == value) {
            int nextWait = this.wait;
            Node node = nodeMap.get(value);
            while (node != null) {
                System.out.println(node.value + " " + this.wait);
                nextWait++;
                remove(node.value);
                node = node.next;
            }
            this.wait = nextWait;
        }
    }


    class Node {
        Node next;
        int value;

        public Node(Node next, int value) {
            this.next = next;
            this.value = value;
        }
    }
}

标签:并打印,node,headMap,int,value,Node,remove,接收,结构设计
来源: https://www.cnblogs.com/tianyiya/p/15425029.html