如何传播&#34;将`ArrayList <string>`排序到另一个?</string>

时间:2013-09-12 16:21:42

标签: java android sorting arraylist

我有多个ArrayList<String> s“链接”到我用来构建列表视图的自定义适配器中。 现在假设它们总共只有两个,以简化。 我想对其中一个进行排序,然后将这个新顺序反映到另一个中,以保持列表的一致性。

这就是我想要做的事情并且不起作用,以IndexOutOfBoundsException: Invalid index 0, size is 0签署的*行结束。

// initial declarations:
List<String> filenameEntries = new ArrayList<String>();
List<String> idEntries = new ArrayList<String>();

/* various operations that fill
the two ArrayList here... */

// sorting:
List<String> oldFilenameEntries = new ArrayList<String>();
List<String> oldIdEntries = new ArrayList<String>();

oldFilenameEntries = filenameEntries;
oldIdEntries = idEntries;

idEntries.clear();

Collections.sort(filenameEntries);

for (int i = 0; i < filenameEntries.size(); i++ ) {
    for (int j = 0; j < oldFilenameEntries.size(); j++ ) {
        if (oldFilenameEntries.get(j) == filenameEntries.get(i)) {
            idEntries.add(oldIdEntries.get(j));  // *
        }
    }
}

我的想法是搜索新ArrayList中的每个元素,然后使用这个“旧”索引重新编译另一个ArrayList。

(我有限制另一个“已排序”的ArrayList必须再次idEntries。这是我做这种转移的方式)

有什么建议吗? 感谢。

修改 我认为这是一个排序问题然后出来我错过了为ArrayLists制作副本的正确方法。感谢大家指出错误发生在

oldFilenameEntries = filenameEntries;
oldIdEntries = idEntries;

为什么。

我接受了更快地指出解决方案的答案。 我删除了上面的两行并将之前的内容改为

List<String> oldFilenameEntries = new ArrayList<String>(filenameEntries);
List<String> oldIdEntries = new ArrayList<String>(idEntries);

从我所看到的ATM似乎都按预期工作。

4 个答案:

答案 0 :(得分:3)

问题是赋值:oldIdEntries = idEntries;这导致两个引用都指向同一个列表,所以当你执行idEntries.clear();时,你已经清除了两个指向的列表。您需要制作列表的副本,而不仅仅是分配参考。

Collections.copy

Lists.copy

ImmutableList.copy()

答案 1 :(得分:1)

问题在于以下两行:

oldFilenameEntries = filenameEntries;
oldIdEntries = idEntries;

此后,old...和原始变量都指向同一个列表。然后你拨打idEntries.clear()。这会清除idEntriesoldIdEntries,因为它们指向相同的列表。

要使其正常工作,您需要复制列表而不是仅仅分配它。您可以使用Collections.copy()。这是一个例子:

Java Collections copy list - I don't understand

另一方面,这种方法看起来过于复杂 - 但是你也不太清楚你想要完成什么,所以我无法建议更好的方法。

答案 2 :(得分:0)

迭代排序列表,克隆每个对象,然后将其添加到新数组列表

答案 3 :(得分:0)

两个问题: 之一:

oldFilenameEntries = filenameEntries;
oldIdEntries = idEntries;

现在,旧条目和新条目都指向同一个列表。 然后,idEntries.clear(). 这将清除旧条目和新条目。 如果您想以某种方式,请使用Collections.copy()

<强>两个 如果你只是要检查是否相等,我不明白为什么你需要有两个for循环,并且都已经排序。

你可以这样做:

for (int i = 0; i < filenameEntries.size(); i++ ) {
        if (oldFilenameEntries.contains(filenameEntries.get(i)) {
            idEntries.add(oldIdEntries.get(j));  // *
        }
    }
}

注意:因为我不知道您的代码的原始点是什么,并且我可以从您的代码段中推断出相等性检查,我建议这样做。