【问题标题】:Java: Collection sorting, returning changed indexesJava:集合排序,返回更改的索引
【发布时间】:2014-06-01 19:47:01
【问题描述】:

在 Java 中,我目前设置了我的 PriorityQueue 以将对象添加到列表中需要它们的位置,理想情况下,我想对所有移动的项目调用一个方法,例如:

列表 = {0,10,20,30,40,50,60,70,80,90,100}。

加 55

列表 = {0,10,20,30,40,50,55,60,70,80,90,100}

会向下移动的对象: {0,10,20,30,40,50}(索引:7,8,9,10,11,12)

我只需要担心这个列表中最高的 8 个项目,所以,理想情况下它只会调用方法:

{40,50}(索引:7,8)

如果低于该索引的任何内容发生更改,我无需费心检查它。 我已经尝试通过创建一个 LinkedList、使用 Collections.sort 并在下一个排序之前克隆前 8 个元素来做到这一点。但我不断遇到空指针或索引越界异常。

谁能提供一个更通用的方法来解决这个问题? 我目前的迭代方法:

Hit[] sorted = hitList.toArray(new Hit[hitList.size()]);
    for (int i = sorted.length - 1; i > 0; i--) {
        if (sorted[i] != clone[i]) { // Nullpointer, arrays are not of equal length
            System.out.print("CHANGE AT " + i);
        }
        System.out.println("");
    }

我的意思是,肯定有一种方法可以避免这整个难题,例如扩展优先级列表和覆盖 add... 这不是一个选项,因为所有有用的方法都是私有的。

【问题讨论】:

  • PriorityQueue 仅跟踪顶部元素。剩余元素的顺序未指定。您必须使用SortedSet 或手动排序集合。

标签: java arrays list sorting priority-queue


【解决方案1】:

我会这样做:

TreeSet<T> set = new TreeSet<>();

public void add(T t) {
    List<T> oldHead = new ArrayList<>(set).subList(0, Math.min(set.size(), 8));
    set.add(t);
    List<T> newHead = new ArrayList<>(set).subList(0, Math.min(set.size(), 8));
    for (T e : oldHead) {
        int oldIndex = oldHead.indexOf(e);
        int newIndex = newHead.indexOf(e);
        if (oldIndex != newIndex) {
            System.out.println(e + ": " + oldIndex + "->" + newIndex);
        }
    }
}

确保按预期处理重复条目。

【讨论】:

  • 稍作调整后,这个方法绝对完美。 +1 真正理解我的意思:P
【解决方案2】:

在 Java 中,索引从 0 开始(第一个元素的索引为 0,第二个元素的索引为 1,依此类推)。在您的情况下,第 12 个元素(最后一个)的索引为 11(不是您写的 12),因此要求索引为 12 的元素(即第 13 个元素)会导致 Null 指针或索引超出范围异常。

编辑后的代码如下:

Hit[] sorted = hitList.toArray(new Hit[hitList.size()]);
for (int i = clone.length - 1; i > 0; i--) {
    if (sorted[i + sorted.length - clone.length] != clone[i]) {
        System.out.print("CHANGE AT " + i);
    }
    System.out.println("");
}

【讨论】:

  • 是的,我知道,问题出在我检查长度不等的克隆数组时,有什么简单的检查方法?我将添加我当前的迭代方法。
  • 您不能同时要求 12 和 8 元素数组的索引 11。我会想办法解决的
  • 没错。但是再一次,这太可怕了,当推送明显发生在 add 时,我不得不克隆整个数组。
  • 我刚刚编辑了我的答案,尝试了代码(仅当 sorted 大于或等于数组长度中的克隆时才有效,否则拆分操作数)
  • 我毫不怀疑这会起作用,但是当列表的顺序发生变化时需要克隆一个数组似乎违反直觉......
猜你喜欢
  • 2010-09-17
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多