【问题标题】:Problems with sorting List<List<String>> java?排序 List<List<String>> java 的问题?
【发布时间】:2020-08-07 09:45:26
【问题描述】:

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

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

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

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。

【问题讨论】:

  • 你能告诉我们最小的可重现代码吗?
  • 我有一个 List> 和一些数据,然后我对它进行排序。然后将其打印到控制台。
  • 您需要在 lambda 参数中指定类型。 (List&lt;String&gt; e )-&gt; e.get(0)
  • 是的@saka1029 你的评论解决了我的问题

标签: java sorting arraylist java-11


【解决方案1】:

似乎一旦你有了第二层,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 c = Comparator.comparing( e->e.get(0) ).reversed();
| ^---^
|错误:
|不兼容的类型:java.util.Comparator 无法转换为 java.util.Comparator>
| Comparator c = Comparator.comparing( e->e.get(0) ).reversed();
| ^--------------------------------------------^

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

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

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

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

【讨论】:

  • Comparator.comparing(e -&gt; e.get(0), Comparator.reverseOrder())。或Collections.reverseOrder(Comparator.comparing(e -&gt; e.get(0)))。通常,任何嵌套方法调用而不是链接它们的东西。否则,您需要显式类型。
猜你喜欢
  • 2013-05-15
  • 2015-02-14
  • 1970-01-01
  • 2016-11-25
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 2017-11-02
相关资源
最近更新 更多