有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用不同长度的1D列表对Java中的2D arraylist进行排序

我一直在尝试使用自定义Comparator对2D ArrayList进行词典排序。但是每个1D列表的长度都不一样,所以我没有得到预期的结果。这是我的代码:

List<ArrayList<Integer>> a = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> a1 = new ArrayList<Integer>();
ArrayList<Integer> a2 = new ArrayList<Integer>();
ArrayList<Integer> a3 = new ArrayList<Integer>();
ArrayList<Integer> a4 = new ArrayList<Integer>();

a1.add(1);

a2.add(1);
a2.add(3);

a3.add(1);
a3.add(2);
a3.add(3);

a.add(a1);
a.add(a2);
a.add(a3);

Collections.sort(a, new Comparator<ArrayList<Integer>>() {
    @Override
    public int compare(ArrayList<Integer> a, ArrayList<Integer> b) {
        if (a.get(0) < b.get(0))
            return 1;
        return -1;
    }
});
System.out.println(a);

所以输入是[[1], [1, 3], [1, 2, 3]]

我的输出是[[1, 2, 3], [1, 3], [1]]

预期的输出是[[1],[1,2,3],[1,3]]

请指出使代码正常工作所需的错误和添加内容


共 (3) 个答案

  1. # 1 楼答案

    首先确定要比较的列表中哪一个较短。例如,您可以使用方法Math.min(int a, int b)来确定这一点。然后将第一个列表的每个元素与第二个列表的相应元素进行比较。如果它们不相等,则返回此比较的结果。如果全部相等,则比较列表的长度并返回此值

    List<List<Integer>> listOfLists = new ArrayList<>();
    List<Integer> listOne = new ArrayList<>();
    listOne.add(1);
    
    List<Integer> listTwo = new ArrayList<>();
    listTwo.add(1);
    listTwo.add(2);
    listTwo.add(3);
    
    List<Integer> listThree = new ArrayList<>();
    listThree.add(1);
    listThree.add(3);
    
    listOfLists.add(listOne);
    listOfLists.add(listTwo);
    listOfLists.add(listThree);
        
    Collections.sort(listOfLists, new Comparator<List<Integer>>() {
        @Override
        public int compare(List<Integer> first, List<Integer> second) {
            int comp = 0;
            for(int i = 0; i < Math.min(first.size(), second.size()); i++){
                comp = Integer.compare(first.get(i), second.get(i));
                if(comp != 0){
                    return comp;
                }
             }
             return Integer.compare(first.size(), second.size());
        }
    });
    System.out.println(listOfLists);
    
  2. # 2 楼答案

    看来你需要按字典顺序排列。Guava library的实用方法可以帮助您:

    import com.google.common.collect.Comparators;
    ...
    Collections.sort(a, Comparators.lexicographical(Comparator.naturalOrder()));
    
  3. # 3 楼答案

    您正在尝试定义一个自定义的Comparator排序2d整数ArrayList,比较两个1dArrayList的两个String表示:例如,使用ArrayList{}和[1, 3],您将比较字符串"1""13"。这可以使用下面的streams和String.valueOf方法获得,我假设您没有空整数ArrayList

    Collections.sort(a, new Comparator<List<Integer>>() {
        @Override
        public int compare(List<Integer> a, List<Integer> b) {
            String j1 = a.stream().map(String::valueOf).collect(Collectors.joining(""));
            String j2 = b.stream().map(String::valueOf).collect(Collectors.joining(""));
    
            return j1.compareTo(j2);
        }
    });
    

    这将产生您预期的有序输出