如何使用 Java 中的 Collection.sort lambda 表达式按不确定数量的变量进行排序?

How to sort by an indeterminate amount of variables with a Collection.sort lambda expression in Java?

我有一个名为 Polynomial 的 class,它的每个 Term 都有一个迭代器,它由两个 int 组成,expco(指数和系数)。这些 Termexp 降序排列(例如 5x^2 + x 是一个可能的多项式,而 x + 5x^2 不是)。我试图查看多项式是否为“弱排序”,它仅检查连续多项式的指数。例如,

4x^3 + 2.3x + 8
5x^4 + 5
4.4x^4 + 5.4x^2 + 8.2

是弱排序,因为第一个多项式的最高指数小于第二个,第三个被认为大于第二个,因为它的第二项有 x^2.

如何在 Collections.sort lambda 表达式中实现这种类型的排序?我想不出一种方法来查看多项式中的每个指数并将它们一一比较。现在我只是比较第一个多项式的指数的第一项和第二个,如果它们相等,比较指数的累积和。但是,这是不正确的,因为我们可以有许多“x”项,并且具有比具有单个 x^2 项的多项式更高的累积和,该多项式被认为大于正确定义下的多项式。这是我目前不正确的方法:

Collections.sort(weakSortedPolys,
                        (firstP, secondP) -> firstP.termList.head.term.exp < secondP.termList.head.term.exp ? -1
                                : firstP.termList.head.term.exp > secondP.termList.head.term.exp ? 1
                                        : firstP.expCumSum < secondP.expCumSum ? -1
                                                : firstP.expCumSum > secondP.expCumSum ? 1 : 0);

我觉得我应该循环 .thenComparing,但我不确定如何与 lambda 表达式一起执行此操作,这是我的项目的要求。

我不会给你答案,所以你可以很高兴自己让它工作。这个想法与比较两个字符串是一样的。通过两个字符串一次从左到右前进一个字符。比较字符对。只要他们是平等的,就继续前进。当你找到一个不相等的对时,字符的顺序给出了字符串的顺序。如果一个字符串用完了字符而另一个字符串仍然有一些字符,则另一个大于一个。如果您到达两个字符串的末尾,则它们相等。

作为 lambda,这看起来像

(a, b) -> {
  for (int i = 0; i < Math.min(a.length(), b.length()); ++i) {
    if (a.charAt(i) < b.charAt(i)) return -1;
    if (a.charAt(i) > b.charAt(i)) return +1;
  }
  return a.length() < b.length() ? -1 : a.length() > b.length() ? +1 : 0;
}

如果您的多项式存储为链表,那么您将需要两个指针而不是单个索引来跟踪项,但逻辑是相似的。

感谢 Gene,我想到了:

Collections.sort(weakSortedPolys, (thisP, otherP) -> {
    Iterator<Term> thisIterator = thisP.iterator();
    Iterator<Term> otherIterator = otherP.iterator();
    while (thisIterator.hasNext()) {
        float thisTermExp = thisIterator.next().exp;
        float otherTermExp = otherIterator.next().exp;
        if (thisTermExp == otherTermExp) {
            continue;
        } else if (thisTermExp > otherTermExp) {
            return 1;
        } else {
            return -1;
        }
    }
    return 0;
});