【问题标题】:Sort Sets in ArrayList by Size按大小对 ArrayList 中的集合进行排序
【发布时间】:2012-10-23 21:25:44
【问题描述】:

我想通过将所有集合放在一个列表中来做到这一点,然后该列表将放在一个地图中,其中关键是大小。我知道一个集合的最大大小(给我),所以我可以在 0 和那个数字之间迭代,获取每个列表,然后遍历每个列表并将每个集合放入一个数组列表中。

但是,这看起来非常笨拙 - 有没有更好的方法来做到这一点?有什么方法可以根据尺寸做比较器功能吗?

谢谢

【问题讨论】:

    标签: java sorting set


    【解决方案1】:

    您可以为此提供Comparator。并使用Collections.sort()

    class SizeComarator implements Comparator<Set<?>> {
    
        @Override
        public int compare(Set<?> o1, Set<?> o2) {
            return Integer.valueOf(o1.size()).compareTo(o2.size());
        }
    }
    
        ArrayList<Set<String>> arrayList = new ArrayList<Set<String>>();
        Set<String> set1 = new HashSet<String>();
        set1.add("A");
        set1.add("B");
        Set<String> set2 = new HashSet<String>();
        set2.add("A");
        arrayList.add(set1);
        arrayList.add(set2);
        Collections.sort(arrayList, new SizeComarator());
        System.out.println(arrayList);
    

    输出:

     [[A], [A, B]]
    

    【讨论】:

    • 嗯,所以我要排序的东西实际上是一个作为私有类实现的对象 - 这种方法仍然适用吗?
    • @praks5432 添加了更多代码,以便您理解:)
    • 当心这个实现。我怀疑将相同的大小返回到例如TreeSet&lt;&gt;#add() 将导致项目被视为相同并被丢弃。
    【解决方案2】:

    除了另一个(完全有效的)答案,我只是指出您不需要显式定义一个新类,您可以匿名创建一个:

    Collections.sort(myList, new Comparator<Set<?>>() {
        @Override
        public int compare(Set<?> o1, Set<?> o2) {
            return Integer.valueOf(o1.size()).compareTo(o2.size());
        }
    });
    

    当然,如果您打算多次使用这样的比较器,那么我会考虑明确定义它。


    相关的javadocs:

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 2011-03-29
      • 2013-09-18
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      相关资源
      最近更新 更多