如何根据自定义所需顺序对包含列表的数组列表进行排序

Posted

技术标签:

【中文标题】如何根据自定义所需顺序对包含列表的数组列表进行排序【英文标题】:How to sort array list contains list as elements based on custom required order 【发布时间】:2021-12-15 02:10:17 【问题描述】:

我有一个数组列表,类似于List<List<Integer>> res = new ArrayList(); 经过一些处理后,我的 res 数组列表将包含 [1, 1, 2] [1, 1] [1, 2] [1] [2] 这些元素,但我想要排序的顺序,看起来像 [1] [1 1] [1 1 2] [1 2] [2]

所以我所做的是

   Collections.sort(res,new Comparator<List<Integer>>()
        public int compare(List<Integer> o,List<Integer> s)
            int c=0;
            //c=o.size().compareTo(s.size());
            //if(c==0)
                for(int i=0;i<Math.min(s.size(),o.size());i++)
                    c=o.get(i).compareTo(s.get(i));
                    if(c!=0) return c;
                
           //
        
            return c;
            
    );

但它不起作用

【问题讨论】:

compare 方法中放一个断点,看看一些比较是什么样的。或者只是在纸上计算 [1] 和 [1 2] 之间的比较结果。 【参考方案1】:

尝试比较列表的大小,而不是只在compare 末尾返回c

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class Main 

    public static void main(String[] args) 
        List<List<Integer>> list = new ArrayList<>();
        list.add(new ArrayList<>(Arrays.asList(1, 1, 2)));
        list.add(new ArrayList<>(Arrays.asList(1, 1)));
        list.add(new ArrayList<>(Arrays.asList(1, 2)));
        list.add(new ArrayList<>(Arrays.asList(1)));
        list.add(new ArrayList<>(Arrays.asList(2)));
        
        System.out.printf("Before: %s%n", list);
        
        Collections.sort(list, new Comparator<List<Integer>>() 
            public int compare(List<Integer> o, List<Integer> s) 
                for (int i = 0; i < Math.min(o.size(), s.size()); i++) 
                    int c = o.get(i).compareTo(s.get(i));
                    if (c != 0) 
                        return c;
                    
                
                return Integer.compare(o.size(), s.size());
            
        );
        
        System.out.printf("After: %s%n", list);
    


输出:

Before: [[1, 1, 2], [1, 1], [1, 2], [1], [2]]
After: [[1], [1, 1], [1, 1, 2], [1, 2], [2]]

【讨论】:

以上是关于如何根据自定义所需顺序对包含列表的数组列表进行排序的主要内容,如果未能解决你的问题,请参考以下文章

python按自定义顺序排序字典列表[重复]

如何根据GPA对数组列表进行升序排序? arraylist 包含一个对象数组。 (Java)[重复]

对包含自定义类的列表进行排序

按自定义顺序排序列表

在 Python 中使用自定义顺序对列表进行排序

数组列表排序[重复]