我有很多物品需要转换为相同类型的物品地图:
List<Item> items = //10^6 items of different types
Map<Type, List<Item>> itemsByType = new ConcurrentHashMap<>();
for (Item item : items) {
itemsByType.computeIfAbsent(
item.getType(),
i -> new ArrayList<>()
).add(item);
}
然后,每种类型都按long
类型标识符排序;并且,每个类型项列表均按long
个项标识符排序。最后,对有序列表进行处理。
这很好,但是我想知道是否有更有效的方法来完成所有这些工作??
答案 0 :(得分:1)
您可以使用java-8 groupingBy
2N
如果您想要Map<Type, List<Item>> itemsByType = items.stream()
.sorted(Comparator) //for any sorting you can use sorted with comparator
.collect(Collectors.groupingBy(Item::getType));
,可以使用groupingByConcurrent
ConcurrentHashMap
您可以将重载的groupingBy与ConcurrentMap<Type, List<Item>> itemsByType = items.stream()
.collect(Collectors.groupingByConcurrent(Item::getType));
一起使用,以便根据键对地图进行排序
TreeMap
您还可以在一个链中使用排序键和排序值来收集地图
TreeMap<Type, List<Item>> map = list
.stream()
.collect(Collectors.groupingBy(
Item::Type,
() -> new TreeMap<>(Comparator.comparingLong(Type::getId)),
Collectors.toList()));
答案 1 :(得分:0)
您可以使用MultiMap
,例如guava's。这是他们的代码示例:
ListMultimap<String, String> multimap = ArrayListMultimap.create();
for (President pres : US_PRESIDENTS_IN_ORDER) {
multimap.put(pres.firstName(), pres.lastName());
}
for (String firstName : multimap.keySet()) {
List<String> lastNames = multimap.get(firstName);
out.println(firstName + ": " + lastNames);
}
...产生如下输出:
Zachary: [Taylor]
John: [Adams, Adams, Tyler, Kennedy] // Remember, Quincy!
George: [Washington, Bush, Bush]
Grover: [Cleveland, Cleveland] // Two, non-consecutive terms, rep'ing NJ!
...
TreeMultimap
对键和值进行了排序,如果我能正确理解标题,这就是您想要的。
在需要检查某个键是否存在某个值的情况下,Multimap尤其有用,因为无需获取键的集合然后搜索该键即可支持该操作
multimap.containsEntry("John", "Adams");