使用Collections.binarySearch从预先填充的ArrayList中删除重复项

时间:2014-06-20 00:16:43

标签: java collections arraylist duplicates

对于作业,我被赋予了一个任务,即在预先填充的文件中读取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

2 个答案:

答案 0 :(得分:0)

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

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)可能会或可能不会更快,并且上述解决方案可能会更快 - 如果对您来说很重要,请进行配置以确保它“#1}}。问题,然后是基准。)

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

如果重复使用输入列表很重要(无论是作为任意作业要求还是最小化内存使用/流失),您都可以执行类似

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

答案 1 :(得分:0)

由于新Java已经发布,我不妨发布这篇文章以帮助&#34;未来的搜索者&#34;。

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