排序 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();
我有一个 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();