将特定项目移动到列表的末尾

时间:2014-04-07 07:18:58

标签: java arraylist comparator

我在ArrayList中有一个Java

{"deleteItem", "createitem", "exportitem", "deleteItems", "createItems"}

我想将包含delete的所有字符串移动到列表的末尾,这样我就可以获得下一个:

{"createitem", "exportitem", "createItems", "deleteItem", "deleteItems"}`

我可以创建两个子列表 - 一个用于包含'delete'字样的单词,另一个用于其他单词,然后合并它们,但我会搜索更有效的方法。

3 个答案:

答案 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而不是数组列表。这样可以避免为每个删除操作重写底层数组。

然后,您只需遍历列表,为removeaddLast调用包含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);
        }
    }

这比排序更快。