我在ArrayList
中有一个Java
:
{"deleteItem", "createitem", "exportitem", "deleteItems", "createItems"}
我想将包含delete
的所有字符串移动到列表的末尾,这样我就可以获得下一个:
{"createitem", "exportitem", "createItems", "deleteItem", "deleteItems"}`
我可以创建两个子列表 - 一个用于包含'delete'字样的单词,另一个用于其他单词,然后合并它们,但我会搜索更有效的方法。
答案 0 :(得分:12)
使用自定义比较器:
List<String> strings = Arrays.asList(
"deleteItem", "createitem", "exportitem", "deleteItems", "createItems"
);
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(final String o1, final String o2) {
if (o1.contains("delete") && !o2.contains("delete")) {
return 1;
}else if (!o1.contains("delete") && o2.contains("delete")) {
return -1;
}
return 0;
}
};
Collections.sort(strings, comparator);
System.out.println(strings);
答案 1 :(得分:3)
如果你想要一些有效的东西并且需要删除List
的开头和中间的元素,我建议使用LinkedList
而不是数组列表。这样可以避免为每个删除操作重写底层数组。
然后,您只需遍历列表,为remove
和addLast
调用包含delete
的任何字符串。
当然,只有在没有任何内容阻止您将ArrayList
替换为LinkedList
时才会出现这种情况。
答案 2 :(得分:1)
你只想把删除的元素放在列表的末尾,这样排序就是O(nlogn),而我们可以在O(n)中的一次传递中执行此操作(尽管使用了新名单)。我们可以创建一个新的LinkedLIst并传递原始列表,在结尾添加“delete”元素,在结束时添加其他元素。
LinkedList<String> orderedList = new LinkedList<>();
for(String e:originalList){
if (e.indexOf("delete")>=0) {
orderedList.addLast(e);
} else {
orderedList.addFirst(e);
}
}
这比排序更快。