当前位置: 首页 > 知识库问答 >
问题:

Java 流排序 - 具有 2 个或更多对象条件的比较器

赏成益
2023-03-14

问题:我试图检查我是否可以使用2个或更多标准对列表(数据类型对象的ArrayList)进行排序。请注意,我知道使用比较器和比较功能。我希望检查是否有方法使用2个或更多标准进行排序,而不必使用我可以轻松使用比较器功能的自定义数据类型。对于1个标准排序,以下代码有效。

在这种情况下,如果我执行以下操作,IntelliJ IDE会立即给出一个错误,表示o.get(3)的“无法解析方法”get(int)”

.sorted(Comparator.comparing(o -> o.get(3).toString()).thenComparing(...)

我还提到了这个论坛示例中的许多线程——Link1 Link2

代码(这适用于单一标准)

List<List<Object>> listOutput = new ArrayList<>();
.........
.........
listOutput = listOutput
                    .stream()
                    .sorted(Comparator.comparing(o -> o.get(3).toString()))
                    .collect(Collectors.toList());

添加(对象的详细信息)

(注)

String数据类型-exchange、broker、段和coCode

LocalDate数据类型-tradeDate

LocalTime数据类型-tradeTime

双精度数据类型 - 卖出价格,买入价格

List<Object> lineOutput = new ArrayList<>();
lineOutput.add(exchange);
lineOutput.add(broker);
lineOutput.add(segment);
lineOutput.add(tradeDate);  // Entry Date
lineOutput.add(tradeTime);   // Entry Time
lineOutput.add(coCode);
lineOutput.add(sellPrice - buyPrice);   // Profit / Loss 
listOutput.add(lineOutput); // Add line to Output

共有2个答案

通俊发
2023-03-14

我也有过几次这样的问题,尤其是比较器。 <罢工> Eclipse和/或java编译器很难正确推断类型 。正如Holger指出的,这不是一个bug,而是按照指定的方式工作:比较器中的类型不能仅仅由< code>sorted参数的预期类型来推断。你必须手动/明确地输入足够的信息来编译:

List<List<Object>> listOutput = new ArrayList<>();
listOutput = listOutput.stream()
                       .sorted(Comparator.comparing((List<Object> o) -> o.get(3).toString())
                                         .thenComparing(o -> o.get(2).toString()))
                       .collect(Collectors.toList());

在随后的中,然后通过比较正确识别类型。

郑旭
2023-03-14

编译器似乎无法推断出正确的类型(我尝试过javac 8和9具有相同的效果)。我唯一可以让它工作的方法就是直接通过强制转换来指定类型:

list.stream()
    .sorted(
       Comparator.comparing((List<Object> o) -> o.get(3).toString())
                 .thenComparing((List<Object> x) ->  x.get(3).toString()));
 类似资料:
  • 问题内容: 我有一个简单的类,其中包含一个字符串(名称)和一个整数(年龄)。应存储在集合中的对象不得具有双名值,并且应根据年龄的降序进行排序。第一个代码示例删除所有双精度名称,但不包含第二个排序条件: 下一个示例比较器将对其余对象集进行排序,该对象集不包含任何重复名称: 第二个比较器正确地根据对象的年龄值对它们进行排序,但是它允许使用重复名称,我不明白,因为外部if语句已经检查了两个对象的名称是否

  • 问题内容: 我有5个字段的对象: 要排序的的我写了下面。 这是在具有多个要比较的对象的对象上实现的正确方法吗? 问题答案: 您的方法可能是正确的,但是效率低下(不必要地调用equals)并且难以阅读。可以这样重写: 更好的方法是使用库方法将所有这些逻辑抽象掉,这样您就不必考虑它了。例如使用apache.commons.lang CompareToBuilder

  • 问题内容: 通过创建这样的对象 并传递给 它可以像这样漂亮地生成SQL 但是,这都是“ AND”条件,如何通过创建条件对象来生成“ OR”条件? 问题答案: 似乎现在有另一种格式 会产生 参见文档:http : //docs.sequelizejs.com/en/latest/docs/querying/#where

  • 我需要整理一份arrayList。我可以使用比较器并重写比较函数进行排序。或者我可以自己编写一个合并排序函数,对ArrayList进行排序。 我在某处读到比较器排序使用冒泡排序算法。因为合并排序的复杂度较低,所以我选择合并排序,而不是使用更容易实现的比较器。

  • 问题内容: 是否有任何方法可以接收2个JSON对象并将其进行比较以查看是否有任何数据已更改? 编辑 在审查评论之后,需要进行一些澄清。 JSON对象定义为 “一组无序的名称/值对。一个对象以{(左括号)开始,以}(右括号)结束。每个名称后面都带有:(冒号),名称/值对之间以,(逗号)分隔。 ”。- json.org 我的目标是能够简单地比较2个JSON对象文字。 我不是javascript专家,所

  • 我希望有一个更具体的可比接口,以便我可以更好地键入返回参数。该界面目前如下所示: 现在,当我尝试对这些更具体的可比值列表进行排序时,如下所示,我收到一个错误,因为b的类型是“RankComparable”而不是类型“T”。 为了解决这个问题,我可以实现如下所示的Self方法。这将解决我的问题,但它看起来非常丑陋。如果有人能找到解决这个问题的更好的办法,我会很高兴。