从具有重复性的排序数组创建未排序集时获取未排序集

Getting an unsorted set when creating it from a sorted array with duplicity

我正在使用一个包含一些重复值的排序数组,然后为了简单地消除重复性,我将每个值添加到集合中。当我从一个排序的数组创建一个集合时,为什么我没有得到一个排序的集合?

这是我的代码:

Set<Integer> set = new HashSet<Integer>();

    for(int score: scores) 
        if(!(set.contains(score)))
            set.add(score);

    System.out.println(set);

分数值是100 100 50 40 40 20 10

预期输出:[100, 50, 40, 20, 10]

实际输出:[50, 100, 20, 40, 10]

如果要对 Set 进行排序,请使用 TreeSet。 TreeSet 是一个排序集实现,默认由 Java 给出。官方文档中有更多信息 https://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html

Set<Integer> set = new TreeSet<Integer>();

for(int score: scores) 
    //if(!(set.contains(score))) # this is not needed as set already handles duplicates
        set.add(score);

System.out.println(set);

我看到你在做 if(!(set.contains(score))) 这个比较。那为什么不去列一个清单呢?列表将保持插入顺序。

int scores[]= {100,100,50,40,40,20,10};
        List<Integer> list=new ArrayList<Integer>();

        for(int score: scores) 
            if(!(list.contains(score)))
                list.add(score);

        System.out.println(list);
    }

输出::

[100, 50, 40, 20, 10]

您可以结合接口 SortedSet with Collections.reverseOrder() 来获得如下所示的反向顺序集:

int[] scores = new int[]{100, 100, 50, 40, 40, 20, 10};
SortedSet<Integer> set = new TreeSet<>(Collections.reverseOrder());
for (int score : scores) { 
    set.add(score);
}
System.out.println(set); //<--it will print [100, 50, 40, 20, 10]