排序 List<List<String>> java 有问题?

Problems with sorting List<List<String>> java?

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

    // 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。

似乎 java 不会在您拥有第二层后推断类型。

在第一个例子中。

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

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

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

'comparing' 的类型未被推断。您可以通过几种方式解决这个问题,最简单的是明确的。

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

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

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

| Error: | cannot find symbol
| symbol: method get(int)
| Comparator<List> c = Comparator.comparing( e->e.get(0) ).reversed();
| ^---^
| Error:
| incompatible types: java.util.Comparator<java.lang.Object> cannot be converted to java.util.Comparator<java.util.List<java.lang.String>>
| Comparator<List> c = Comparator.comparing( e->e.get(0) ).reversed();
| ^--------------------------------------------^

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

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

替代方案,调用Comparator时指定类型。

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