首页 > 解决方案 > java - 如何使用Java中的Collection.sort lambda表达式对不确定数量的变量进行排序?

问题描述

我有一个类Polynomial,它的每个 s 都有一个迭代器Term,它由两个intsexpco(指数和系数)组成。这些Terms 按降序排序exp(例如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);

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

标签: javasortinglambdacomparator

解决方案


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

作为一个 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;
}

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


推荐阅读