List <Item>到Map <Type,List <Item >>,排序键,排序值和处理

时间:2019-12-17 21:26:43

标签: java

我有很多物品需要转换为相同类型的物品地图:

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个项标识符排序。最后,对有序列表进行处理。

这很好,但是我想知道是否有更有效的方法来完成所有这些工作??

2 个答案:

答案 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

您可以将重载的groupingByConcurrentMap<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");