java - 排序列表的问题> 爪哇?
问题描述
我有一个 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。
解决方案
一旦有了第二层,似乎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();
推荐阅读
- text - 从哪里获得预先标记的新闻文章以进行聚类算法
- rest - 存储在数据库中的会话真的违反了 RESTful 吗?
- javascript - 过滤获取的数据数组
- python-3.x - CURL 到 Python 请求的转换 Elastic search
- ios - 如何使用格式化日志消息(获取 time_t、timeval、errno)?
- python-3.x - 我想使用 pyinstaller 将 python tkinter GUI 打包到期望在 Windows 上运行的 EXE 文件,但总是得到这样的错误信息
- android - Android Play 商店应用程序拒绝更新可能是由于删除了权限
- java - 如何将 javafx 表的列设置为对象的 hashmap?
- c++ - Qt Ros 工作区中的 QVTKWidget 问题
- reactjs - 流程未定义