【问题标题】:LinkedList addLast function replacing other values in listLinkedList addLast 函数替换列表中的其他值
【发布时间】:2020-04-14 15:59:06
【问题描述】:

我目前正在实现一个用于发送数据包的队列。但是,我遇到了一个问题,当我在 LinkedList 上使用 addLast 函数时,它会将列表中的每个 Pair 替换为我要添加到其中的 Pair。

队列:

private LinkedList<Pair<Integer, ByteBuffer>> queue;

Pair 已从 javafx.util.Pair 导入;

队列的初始化:

queue = new LinkedList<>();

方法:

    public synchronized void addToQueue(int bytes, ByteBuffer data) {
        Pair<Integer, ByteBuffer> local = new Pair(bytes, data);
        queue.addLast(new Pair(bytes, data));

        if(bytes>2){
            int i = 0;
            for(Pair<Integer,ByteBuffer> datas:queue ){
                System.out.println("\n Data in the "+i+ "th position in queue is: ");
                printByteBufferAsBytes(datas.getValue(), datas.getKey());
                i++;
            }
        }

    }

为了调试,每当发送数据包时,我都会打印data。此方法也可用于发送较小的数据包,但它似乎适用于较小的数据包。

运行代码后,将打印以下结果:

Data in the 0th position in queue is: 
1 5 40 -128 -58 0 0 42 111 34 -24 0 0 0 0 112 114 105 110 116 66 121 116 101 66 117 102 102 101 114 65 115 something was added to queue

 Data in the 0th position in queue is: 
2 5 40 -128 -58 17 0 115 -86 119 76 66 121 116 101 115 40 113 117 101 117 101 46 112 101 101 107 40 41 46 103 101 
 Data in the 1th position in queue is: 
2 5 40 -128 -58 17 0 115 -86 119 76 66 121 116 101 115 40 113 117 101 117 101 46 112 101 101 107 40 41 46 103 101 something was added to queue

 Data in the 0th position in queue is: 
2 5 40 -128 -58 38 0 -102 -46 -61 99 116 86 97 108 117 101 40 41 44 32 113 117 101 117 101 46 112 101 101 107 40 
 Data in the 1th position in queue is: 
2 5 40 -128 -58 38 0 -102 -46 -61 99 116 86 97 108 117 101 40 41 44 32 113 117 101 117 101 46 112 101 101 107 40 
 Data in the 2th position in queue is: 
2 5 40 -128 -58 38 0 -102 -46 -61 99 116 86 97 108 117 101 40 41 44 32 113 117 101 117 101 46 112 101 101 107 40 something was added to queue

 Data in the 0th position in queue is: 
3 5 40 -128 -58 59 0 109 60 120 12 11 41 46 103 101 116 75 101 121 40 41 41 101 117 101 46 112 101 101 107 40 
 Data in the 1th position in queue is: 
3 5 40 -128 -58 59 0 109 60 120 12 11 41 46 103 101 116 75 101 121 40 41 41 101 117 101 46 112 101 101 107 40 
 Data in the 2th position in queue is: 
3 5 40 -128 -58 59 0 109 60 120 12 11 41 46 103 101 116 75 101 121 40 41 41 101 117 101 46 112 101 101 107 40 
 Data in the 3th position in queue is: 
3 5 40 -128 -58 59 0 109 60 120 12 11 41 46 103 101 116 75 101 121 40 41 41 101 117 101 46 112 101 101 107 40

似乎每次将某些内容添加到队列中时,队列中的所有其他值都设置为相同的值。 如果有人知道原因,我将不胜感激。

方法 printByteBufferAsBytes:

    public void printByteBufferAsBytes(ByteBuffer bytes, int bytesLength) {
        for (int i = 0; i < bytesLength; i++) {
            System.out.print(Byte.toString(bytes.get(i)) + " ");
        }
    }

【问题讨论】:

  • 您使用的Pair 类是什么?它是您自己创建的自定义类吗?你能用 Pair 类的包名给出完整的限定符名称吗?
  • 可以分享一下打印方法吗?
  • Pair是javafx.util.Pair,我马上加打印方法
  • 添加到队列时是否使用相同的 ByteBuffer 和 bytesLength? Similar issue occurred here

标签: java arrays linked-list queue keyvaluepair


【解决方案1】:

addToQueue 方法中,您需要将更新后的 ByteBuffer 的内容复制到某个新的字节数组中:

    public synchronized void addToQueue(int bytes, ByteBuffer data) {
        byte[] copy = Arrays.copyOf(data.array(), bytes);

        Pair<Integer, ByteBuffer> local = new Pair<>(bytes, ByteBuffer.wrap(copy));
        queue.addLast(local);
    // ... the rest of the method remains as is

   }

【讨论】:

    【解决方案2】:

    LinkedList上addLast()的实现(Java)如下:

     public void addLast(AnyType item)
       {
          if( head == null)
             addFirst(item);
          else
          {
             Node<AnyType> tmp = head;
             while(tmp.next != null) tmp = tmp.next;
    
             tmp.next = new Node<AnyType>(item, null);
          }
       }
    

    在 Java 中有一个 Queue 的实现,我建议使用它来代替 LinkedList。此外,应该使用出队和入队方法来遵循术语。

    Queue(Java)上的enqueue()和dequeue()方法定义如下:

    public void enqueue(Item item) {
            Node oldlast = last;
            last = new Node();
            last.item = item;
            last.next = null;
            if (isEmpty()) first = last;
            else           oldlast.next = last;
            n++;
            assert check();
        }
    
    public Item dequeue() {
            if (isEmpty()) throw new NoSuchElementException("Queue underflow");
            Item item = first.item;
            first = first.next;
            n--;
            if (isEmpty()) last = null;   // to avoid loitering
            assert check();
            return item;
        }
    

    LinkedLists的一个小说明,方法add()等价于addLast()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 2016-02-20
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      相关资源
      最近更新 更多