【问题标题】:Merge Queues in JavaJava中的合并队列
【发布时间】:2012-11-21 20:33:54
【问题描述】:

我想知道在不从传递的 q 中删除任何元素的情况下,编写将 ArrayQueue 与另一个 Queue 合并的方法的最佳方法是什么。

eg. queue1 = [1,2,3,4] and queue2 = [5,6,7,8,9,10].

queue1.mergeQs(queue2) 被调用时,它将创建queue1 = [1,5,2,6,3,7,4,8,9,10]queue2 将保持[5,6,7,8,9,10]

    public void mergeQs(ArrayQmerge q){}

与传递两个队列并返回一个新的合并队列相比,这种方式似乎更难实现。谢谢。

澄清一下,我正在寻找一种方法来交错两个队列中的元素。

【问题讨论】:

  • 注意:Java 中没有 ArrayQueue 类。不过有ArrayDequeArrayBlockingQueue - 你是说其中一个吗?
  • 我创建了自己的 ArrayQueue 类,该类实现了我自己的 Queue 类。 ArrayQmerge 类扩展了 ArrayQueue 类。
  • 这确实让任何人都难以回答您的问题。因为你一个人可以看到ArrayQueue

标签: java queue


【解决方案1】:

一个可能对您有所帮助的细节是私有字段在Java 中相同 类的不同对象之间可见。这意味着只要您只打算合并自己类的队列,您的代码就可以完全访问所有内部字段,例如用于存储元素的数组。

对于最简单的情况,所有元素都存储在一个线性数组中,队列头的索引为零,这可能是一个开始:

public void mergeQs(ArrayQmerge q) {
    Object[] array = new Object[this.size() + q.size()];

    int i;
    int o;

    // Interleave elements
    for (i = 0, o = 0; i < this.size() && i < q.size(); ++i) {
        array[o++] = this.array[i];
        array[o++] = q.array[i];
    }

    // Copy the remaining elements
    while (i < this.size()) {
        array[o++] = this.array[i++];
    }

    while (i < q.size()) {
        array[o++] = q.array[i++];
    }

    this.array = array;
}

【讨论】:

    【解决方案2】:

    你可以在merge方法中在本地新建一个Queue,然后将你的类的队列分配给本地版本。

    【讨论】:

      【解决方案3】:

      由于您使用的是自己的自制软件ArrayQueue,因此这是猜想。

      创建一个新队列并返回正如我认为您已经说过的那样更容易、更有效,因为将元素插入到一个支持数组的结构中将涉及为每个插入操作将其余元素向下移动一个位置。

      另一种方法是通过换出支持它的底层数组来实现public void mergeQs(ArrayQmerge q)。因此,您可以获得与返回新队列相同的简单实现,但具有相同的副作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-15
        • 1970-01-01
        • 2011-04-25
        • 2011-03-08
        • 2010-11-15
        • 1970-01-01
        相关资源
        最近更新 更多