【问题标题】:Move specific items to the end of a list将特定项目移到列表末尾
【发布时间】:2014-05-19 07:25:24
【问题描述】:

我在Java 中有一个ArrayList

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

我想将所有包含delete 的字符串移到列表的末尾,所以我会得到下一个:

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

我可以创建两个子列表 - 一个用于包含“删除”单词的单词,一个用于其他单词,然后合并它们,但我寻找更有效的方法。

【问题讨论】:

  • 定义“高效”?你的意思是“优雅”吗?我有一种暗示,性能在这里并不重要,所以也许可维护性更重要?如果你真的是说高效,空间更重要还是时间更重要?

标签: java arraylist comparator


【解决方案1】:

您只想将带有 delete 的元素放在列表的末尾,因此排序是 O(nlogn),而我们可以在 O(n) 中一次性完成(尽管使用新名单)。我们可以创建一个新的 LinkedLIst 并通过原始列表,在末尾添加带有“delete”的元素,其他元素在 begginging。

    LinkedList<String> orderedList = new LinkedList<>();
    for(String e:originalList){
        if (e.indexOf("delete")>=0) {
            orderedList.addLast(e);
        } else {
            orderedList.addFirst(e);
        }
    }

这比排序快。

【讨论】:

  • 它比OP提供的解决方案效率如何?
  • 排序,O(nlogn)。我们依赖JVM的排序实现,还算不错,不需要重新发明轮子。
  • 但是搜索是 O(n) 并且是他的解决方案 2 搜索并且加入是 3N 但在 Big Oh 表示法中,如果我错了,它的 O(n) 纠正我
  • 是的,你只需要一次搜索。如果您不关心其他任何事情的顺序。
【解决方案2】:

如果您想要一些高效的东西并且需要删除List 开头和中间的元素,我建议使用LinkedList 而不是数组列表。这样可以避免为每个删除操作重写底层数组。

然后,您只需在列表上进行迭代,对包含delete 的任何字符串调用removeaddLast

当然,只有在没有任何东西阻止您将 ArrayList 替换为 LinkedList 时才可以这样做。

【讨论】:

  • 哈,你比我快... :-)
  • 有时候你需要运气:)
【解决方案3】:

使用自定义比较器:

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);

【讨论】:

  • 如果那些delete&lt;&gt; 字符串也应该被排序呢?我猜是因为作者在deleteItems之前指定了deleteItem
  • 我猜你可以直接替换 return 0;在方法中比较返回 o1.compareTo(o2);
猜你喜欢
  • 2020-06-09
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
  • 2016-06-16
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
相关资源
最近更新 更多