【问题标题】:Getting an unsorted set when creating it from a sorted array with duplicity从具有重复性的已排序数组创建未排序集时
【发布时间】:2020-03-05 04:35:48
【问题描述】:

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

这是我的代码:

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]

【问题讨论】:

  • 为什么不使用 SortedSet进一步为其元素提供总排序的 Set。
  • 请告诉我如何实现?
  • TreeSet 是一个 SortedSet 的实现
  • 请输入代码,我没有得到您想要告诉我的内容

标签: java arrays set redundancy


【解决方案1】:

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

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]

【讨论】:

  • 我看到你在做 if(!(set.contains(score))) - 很好。
【解决方案2】:

您可以将接口SortedSetCollections.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]

【讨论】:

    【解决方案3】:

    如果要对 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);
    

    【讨论】:

    • 这将改变排序顺序。 TreeSet 将按升序对数据进行排序。
    • 如果你想让它降序,你可以改变,用构造函数中的标志。
    猜你喜欢
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多