【问题标题】:How does the sorting of ArrayList of custom object works?自定义对象的 ArrayList 排序如何工作?
【发布时间】:2020-07-25 06:26:37
【问题描述】:

这个 list.sort() 方法实际上是如何根据对象的属性对对象进行排序的。 这是 LeetCode 问题 1337 的解决方案。

class Solution {
public int[] kWeakestRows(int[][] mat, int k) {
    List<Pair> list = new ArrayList<>();
    for(int i = 0; i < mat.length; i++) {
        int cur = 0;
        for(int j = 0; j < mat[0].length; j++) {
            cur += mat[i][j];
        }
        Pair p = new Pair();
        p.index = i;
        p.count = cur;
        list.add(p);
    }

    list.sort((lh, rh) -> 
        lh.count != rh.count ? lh.count - rh.count : lh.index - rh.index
    );

    int[] ret = new int[k];
    for(int i = 0; i < k; i++) {
        ret[i] = list.get(i).index;
    }
    return ret;
}

}

class Pair {
int index;
int count;
}

【问题讨论】:

  • 首先将getIndex()getCount() 添加到Pair,然后您当前的代码可以替换为list.sort(Comparator.comparing(Pair::getCount).thenComparing(Pair::getIndex));,它做同样的事情但更具可读性。我希望它更具可读性,您可以理解它。原始版本不是我认为的好代码。
  • 问题是什么,排序算法是如何工作的?

标签: java sorting object arraylist


【解决方案1】:

List.sort 在参数中接受 Comparator。 由于 Pair 没有实现 Comparable 你不能使用自然排序。因此,这里的比较器被替换为 lambda,此实现使用 countindex 属性来应用排序。

【讨论】:

  • 你的意思可能是Pair,而不是Point
  • 是的。谢谢 ;-)
  • 所以基本上我们已经使用lambda表达式来实现Comparator了?
  • Comparator 是一个函数式接口,您可以用 java 中的 lambda 替换任何函数式接口。 Func 接口 = 只有一个抽象方法的接口。
猜你喜欢
  • 1970-01-01
  • 2010-12-21
  • 2016-06-22
  • 2011-02-16
相关资源
最近更新 更多