【发布时间】:2012-10-31 11:56:57
【问题描述】:
所以,长话短说,我有一个 Java 家庭作业,需要以各种方式操作一个长的字符串数组列表(我们正在做一些事情,比如显示单词的组合,在 ArrayList 中添加和删除,什么也没有特别的)。我注意到一些提供的 ArrayLists 有重复的条目(并且重复项对于此作业不是必需的),所以我得到老师的同意,可以通过删除重复的条目来清理数据。 这是我想出的:
private static ArrayList<String> KillDups(ArrayList<String> ListOfStrings) {
for (int i = 0 ; i < ListOfStrings.size(); i++) {
for (int j = i + 1; j < ListOfStrings.size(); j++) {
//don't start on the same word or you'll eliminate it.
if ( ListOfStrings.get(i).toString().equalsIgnoreCase( ListOfStrings.get(j).toString() ) ) {
ListOfStrings.remove(j);//if they are the same, DITCH ONE.
j = j -1; //removing the word basically changes the index, so swing down one.
}
}
}
return ListOfStrings;
}
这对我的任务来说很好,但我怀疑它在现实世界中是否非常有用。有没有办法在比较过程中忽略空格和特殊字符?一般有没有更清洁的方法来处理这个问题(可能没有嵌套的 For 循环)?还有一个我不知道该问的问题吗?
【问题讨论】:
-
首先:你不需要
toString无处不在,因为这些已经是字符串了。对于您的问题:我相信有很好的内置方法可以做到这一点。如果您想编写自己的,您可以简单地对列表进行排序并仅比较相邻条目以查看它们是否相等。这会给你 O(N) 的时间复杂度(不包括用于排序的 O(NlogN))。 -
由于相当多的答案似乎集中在你没有提到的东西上,如果 OP 能澄清一下,那就太好了:1)在删除重复后,你需要保持列表的顺序吗? 2)当您通过忽略大小写比较删除重复项时,您是否要保留第一个或最后一个字符串(或者您根本不在乎?)?
-
好吧,事实上,在这种情况下顺序并不重要。但是,由于我希望最终结果更有用,因此最好保留原始顺序。
标签: java string for-loop arraylist