【问题标题】:sort list of list based on size of the subList?根据子列表的大小对列表进行排序?
【发布时间】:2023-03-05 15:51:01
【问题描述】:

我有一个列表列表。我想对超级列表进行排序取决于子列表的大小。列表是动态的。
List 类型为<ArrayList<ArrayList<HashMap>>> 例如。

[ [{key1=value1,key2=value2}],[],[{key1=value1}],[{key1=value1},{key2=value2},{key3=value3}]  ]  

排序后应该显示

[[{key1=value1},{key2=value2},{key3=value3}], [{key1=value1,key2=value2}],[{key1=value1}],[]  ]  

你能帮忙解决这个问题吗?

提前致谢。
拉克斯曼杂烩

【问题讨论】:

    标签: java sorting arraylist java-6


    【解决方案1】:

    已编辑

    如果您想对按地图大小列表排序的地图列表列表进行排序,您可以这样做。

    请注意,您可以更改Integer.valueOf(o1.size()).compareTo(o2.size())中的参数(o1o2)的顺序,以降序排列。

    public static <T> List<? extends List<T>> sortListByValue(List<? extends List<T>> list) {
    
        Collections.sort(list, new Comparator<List<T>>() {
    
    
            @Override
            public int compare(List<T> o1, List<T> o2) {
                //return Integer.compare(o1.size(), o2.size()); //JDK7 
    
                //Use this if you're using a version prior to 1.7.
                return Integer.valueOf(o1.size()).compareTo(o2.size());
            }
        });
    
        return list;
    }   
    
    
    public static void main(String[] args) {
    
        ArrayList<Map<String,String>> list1 = new ArrayList<>();
        list1.add(new HashMap<String, String>(){{ put("1", "a"); put("2", "b");}});
        list1.add(new HashMap<String, String>(){{ put("1", "a"); put("2", "b"); put("3", "c");}});
        list1.add(new HashMap<String, String>(){{ put("1", "a"); }});
    
        ArrayList<Map<String,String>> list2 = new ArrayList<>();
        list2.add(new HashMap<String, String>(){{ put("1", "a"); put("2", "b");}});
        list2.add(new HashMap<String, String>(){{ put("1", "a"); put("2", "b"); put("3", "c");}});
    
        ArrayList<Map<String,String>> list3 = new ArrayList<>();
        list3.add(new HashMap<String, String>(){{ put("1", "a"); put("2", "b");}});
    
        ArrayList<ArrayList<Map<String,String>>> list = new ArrayList<>();
        list.add(list1);
        list.add(list2);
        list.add(list3);
        System.out.println(list);
        System.out.println(sortListByValue(list));
    }
    

    【讨论】:

    • 您好,出现以下错误。Integer 类型的 compare(int, int) 方法未定义。如何解决?
    • @Laxmanchowdary 抱歉,它仅适用于 JDK7,请改用:return Integer.valueOf(o1.size()).compareTo(o2.size());
    • @Laxmanchowdary 阅读您正在使用&lt;ArrayList&lt;ArrayList&lt;HashMap&gt;&gt;&gt; 的更新,所以它是 3 级列表,您确定需要这么多列表吗?因为阅读您的示例只是ArrayList&lt;HashMap&gt;
    • 您提供的代码是用于对列表中的地图值进行排序。但我的要求是根据子列表大小按降序对列表进行排序...
    • @Laxmanchowdary 好的,我明白了,您的 HashMap 中只有一对? HashMap的大小不算,只是第二个列表的大小?
    【解决方案2】:
    public static <T> List<List<T>> sortBySublistSize(List<List<T>> superList) {
        Collections.sort(superList, new Comparator<List<T>>() {
            @Override
            public int compare(List<T> o1, List<T> o2) {
                return Integer.compare(o1.size(), o2.size());
            }
        });
    
        return superList;
    }
    

    【讨论】:

    • 您好 Fabian,我正在使用 jdk6。 Integer.compare(o1.size(), o2.size()) 在jdk6中不起作用..这是jdk7的一个特性..
    • @Laxmanchowdary 改用Integer.valueOf(o1.size()).compareTo(o2.size())
    【解决方案3】:
    Collections.sort(list, new Comparator<List<? extends Map>>() {
            public int compare(List<? extends Map> list1, List<? extends Map> list2) {
                return Integer.valueOf(list1.size()).compareTo(Integer.valueOf(list2.size()));
            }
        });
    

    如果你不太关心泛型,你可以简化它,例如:

    Collections.sort(list, new Comparator<List>() {
                public int compare(List list1, List list2) {
                    return Integer.valueOf(list1.size()).compareTo(Integer.valueOf(list2.size()));
                }
            });
    

    【讨论】:

    • 嗨 Wojtek,它抛出以下错误.. Collections 类型中的方法 sort(List, Comparator super T>) 不适用于参数 (List , 新比较器>(){})
    • 如果您仅将列表声明为 List&lt;List&gt; 而不是 List&lt;List&lt;String&gt;&gt;,您可能会删除我的代码 sn-p 中的所有“&lt;String&gt;”部分。
    【解决方案4】:

    您可以使用任何正常的排序算法,但不是基于值,而是基于元素的长度。

    【讨论】:

      猜你喜欢
      • 2020-12-27
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 2019-02-24
      • 2023-04-01
      • 2021-05-02
      相关资源
      最近更新 更多