java - java中Arraylist<Integer>的ArrayList的字典排序

标签 java sorting arraylist

我想对 ArrayList 进行排序的ArrayList<Integer> ,看起来像。

ArrayList<ArrayList<Integer>> allres = new ArrayList<ArrayList<Integer>>();
Collections.sort(allres, new Comparator<ArrayList<Integer>>() {
    public int compare(ArrayList<Integer> a, ArrayList<Integer> b) {
        for (int i = 0; i < a.size(); i++) {
            if (a.get(i) < b.get(i)) {
                return -1;
            } else if (a.get(i) == b.get(i)) {
                continue;
            } else {
                return 1;
            }
        }
        return -1;
    }
});

但是对于某些输入,它没有给出字典排序的结果。

最佳答案

包含 1-1 的比较器函数容易出错。

相反,你应该这样写:

public static int lexicographically(List<Integer> a, List<Integer> b) {
    for (int i = 0, end = Math.min(a.size(), b.size()); i < end; i++) {
        int res = Integer.compare(a.get(i), b.get(i));
        if (res != 0)
            return res;
    }
    return Integer.compare(a.size(), b.size());
}

这种比较器函数的编写风格可以防止各种常见错误,例如从不返回 0。

这种风格中最重要的模式是:

  1. 按照第一个标准进行比较。
  2. 如果给定值不同,则返回比较结果并完成。
  3. 采用下一个标准,继续第 1 步。
  4. 如果没有剩余条件,则返回 0。

关于java - java中Arraylist<Integer>的ArrayList的字典排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55312543/

相关文章:

sorting - Pandas 数据透视表嵌套排序

java - T 具有不同类型的 ArrayList<T>

java - 在 Android 的 Java 中将此字符串分解为键/值字符串的最简单方法是什么?

java - jcifs.smb.SmbException : The parameter is incorrect error- Login form not for entering credential+NTLMv1 request

php - 使用 usort 和全局变量对数组进行排序

java - 按原始 boolean 类型对 ArrayList 进行排序

java - Android 中如何获取 String[] 的项目

java - 如何将按钮的BackgroundTintList设置为默认值?

java - Android:如何使用自签名证书和 SSL 缓存创建 HttpClient

c++ - 这种冒泡排序的递归实现是否效率低下?如果可能的话如何改进?