首页 > 解决方案 > 排序列表的问题> 爪哇?

问题描述

我有一个 List<List> 我想根据 column 对其进行排序。我使用了以下代码。

    // data is List<List<String>>
    data.sort(Comparator.comparing(e-> e.get(col)));                

它的工作和排序根据指定的列。但如果我使用reversed()orthenComparing()方法,它会说

error: cannot find symbol
                    data.sort(Comparator.comparing(e-> e.get(col)).reversed()  );
                                                        ^
  symbol:   method get(int)
  location: variable e of type Object

同样使用 thenComparing 方法,

error: cannot find symbol
                    data.sort(Comparator.comparing(e-> e.get(col)).thenComparing(e->e.get(col2))  );
                                                        ^
  symbol:   method get(int)
  location: variable e of type Object

error: cannot find symbol
                    data.sort(Comparator.comparing(e-> e.get(col)).thenComparing(e->e.get(col2))  );
                                                                                     ^
  symbol:   method get(int)
  location: variable e of type Object
2 errors

我没有从错误消息中得到任何信息。仅供参考,我为此使用 OpenJDK 11。

标签: javasortingarraylistjava-11

解决方案


一旦有了第二层,似乎java就不会推断出类型。

在第一个例子中。

data.sort( Comparator.comparing( e-> e.get(0) ) );

类型是从数据中推断出来的,但在第二个示例中。

data.sort( Comparator.comparing( e-> e.get(0) ).reversed() );

没有推断出“比较”的类型。您可以通过几种方法来解决这个问题,最简单的是明确的。

data.sort( Comparator.comparing( (List<String> e) -> e.get(0) ).reversed() );

java 不链接推理似乎很有趣。如果我们包括创建比较器的中间步骤,我们可以很清楚地看到它没有。

Comparator<List<String>> c = Comparator.comparing( e-> e.get(0) ).reversed();

| 错误:| 找不到符号
| 符号:方法 get(int)
| Comparator<List> c = Comparator.comparing( e->e.get(0) ).reversed();
| ^---^
| 错误:
| 不兼容的类型:java.util.Comparator<java.lang.Object> 无法转换为 java.util.Comparator<java.util.List<java.lang.String>>
| Comparator<List> c = Comparator.comparing( e->e.get(0) ).reversed();
| ^--------------------------------------------^

现在我们得到两个错误,一个在 lambda 中,因为参数是一个 Object,第二个错误是因为我们正在创建 Comparator<Object>。

我认为它是这样工作的,但我不确定如何验证。'reversed' 将采用调用它的实例的类型参数,类型不是推断的。在调用“reversed”时,对象必须已被实例化并分配了泛型。对比较的调用没有上限,它只需要返回一个 Comparator<?>。

另一种解决方案是在调用 Comparator 时指定类型。

Comparator<List<String>> c = Comparator.<List<String>, String>comparing( e->e.get(0) ).reversed();

推荐阅读