按子列表中的项对Java列表进行排序
我有一份清单:
List<List<Item>> = [["a", "one", 3], ["b", "one", 2], ["c", "one", 4], ["d", "two", 2],["e", "one", 1], ["f", "two", 1]]
我想按照子数组中的第二个值对它进行排序,如果有两个a像,那么它应该按照第三个值进行排序,如果它从中找到两个a像,那么它应该按照第一个元素对它们进行排序。 所以最终结果应该是这样的:
[["e", "one", 1], ["b", "one", 2], ["a", "one", 3], ["c", "one", 4], ["f", "two", 1], ["d", "two", 2]]
有人能告诉我一些好方法吗
谢谢
# 1 楼答案
假设than
"one"
小于"two"
(因为"o" < "t"
),并且我在这里没有看到任何其他“字符串数字”*,可以编写一个简单的比较器:然后使用此比较器进行排序:
*对于其他“字符串数字”,如“三”、“四”等,如果需要按意义而不是按词法进行比较,则需要定义特殊映射,将其“意义”转换为
Integer
数字。但这超出了这个问题的范围;发布一个新的,让不那么忙的程序员练习虚拟速度编码# 2 楼答案
["a", "one", 3]
应该是类的实例,如这样,您的列表将是
List<Item>
。现在您可以简单地使用Collections.sort(list, yourComparator)
,或者如果您使用的是java8list.sort(yourComparator)
作为
yourComparator
,您可以以某种方式传递实现Comparator
接口的类的实例但可能更具可读性且可能更简单的方法是为每个字段创建单独的比较器并将它们组合起来。如果您使用的是Java 8,那么您的代码可能如下所示:
# 3 楼答案
正如duffymo所建议的,使用对象列表。一个简单的结构可以:
由于struct实现Comparable,所以您只需排序:不需要比较器
# 4 楼答案
这样做的好方法?不是你想的那样。列表列表太原始;自定义对象列表会更好
为要运行的案例编写自定义比较器