【问题标题】:using Collections.binarySearch to remove duplicates from a pre-populated ArrayList使用 Collections.binarySearch 从预先填充的 ArrayList 中删除重复项
【发布时间】:2014-06-20 00:16:42
【问题描述】:

对于一项作业,我的任务是读取预先填充的文件作为 ArrayList、对其进行排序并删除所有重复项。我的任务是使用 binarySearch API 执行此操作。他说得比较具体。我以前从未这样做过,我不确定我需要做什么才能让 Collections.binarySearch 工作。导师给了我一个开始,但我知道我做的 Collections.binarySearch 的参数不正确,但我终生无法找出正确的方法来做到这一点。如果有人能提供帮助,将不胜感激。

这是我目前所拥有的。如果这很重要,我可以从 set1.txt 发布整数

public static void main(String[] args) {
    collections program = new Collections();
    program.readFile();
}//main

public void readFile() {
    File f = new File("set1.txt");
    try {
        Scanner in = new Scanner(f);
        while (in.hasNext()) {
            int x = in.nextInt();
            int index = Collections.binarySearch(x,0);
            if (index == 1)
                list.add(x);
        }//while
        Collections.sort(list);

        in.close();
    }//try
    catch (IOException e) {
        e.printStackTrace();
    }//catch
}//readFile

【问题讨论】:

  • 你读过javadoc for Collections.binarySearch()吗?您需要满足一些我认为您没有满足的先决条件,以及有关要使用的正确参数的信息。
  • 您是否考虑过只使用某种Set
  • @MadProgrammer 似乎问题描述需要这种特殊用途,但我同意Set 将是最佳解决方案。
  • 我对 Set 不熟悉。 binarySearch 不一定是一个完整的要求,只是反复建议的东西。如果有什么更有效的,我相信它会很好。我只是卡住了,从未使用过 collections.binarySearch 或 Sets。
  • 问题供你思考。在正确排序的数组中,重复值相对于彼此在哪里?鉴于此,您是否需要 binarySearch 来删除重复项?

标签: java collections arraylist duplicates


【解决方案1】:

一旦您对列表进行了排序,重复元素(如果有)将彼此相邻,因此您可以简单地遍历列表以删除任何重复元素,无需搜索。 (我们向后迭代以避免在删除元素后决定是否增加循环计数器的尴尬。)

Collections.sort(list);
for (int i = list.size()-1; i >= 0; --i)
    if (list.get(i).equals(list.get(i+1)))
        list.remove(i);

但确保唯一性的更方便的方法是创建一个 Set 来保存列表的内容,然后从集合中创建一个新列表。新列表将在集合的迭代顺序中包含输入列表的唯一元素,因此我们可以同时使用TreeSet 进行排序。 (使用HashSet 创建列表,然后调用Collections.sort(list) 可能会也可能不会更快,而上述解决方案可能会更快——如果对您很重要,请配置文件以确保这是一个问题,然后进行基准测试。)

list = new ArrayList<>(new TreeSet<>(list));

如果重用输入列表很重要(作为任意作业要求或尽量减少内存使用/流失),您可以执行类似的操作

Set<T> set = new TreeSet<>(list);
list.clear();
list.addAll(set);

【讨论】:

    【解决方案2】:

    既然新的 Java 出来了,我不妨把这个贴出来帮助“未来的寻求者”。

    ArrayList<String> newList = oldList.stream().distinct().collect(Collectors.toCollection(ArrayList::new));
    

    【讨论】:

      猜你喜欢
      • 2018-05-29
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多