如何根据 ArrayListMultiMap 值的大小将键添加到列表中?

How can I add keys to a list based on the size of the value of an ArrayListMultiMap?

我有一个像这样的 ArrayListMultimap

ArrayListMultimap<Long, String> multiMap =  ArrayListMultimap.create();

multiMap.put(100L,"test1");
multiMap.put(750L,"test0");
multiMap.put(50L, "test2");
multiMap.put(500L, "test3");
multiMap.put(200L, "test45");
multiMap.put(200L, "test000");
multiMap.put(60L, "test48");

这给了我 {50=[test2], 100=[test1], 500=[test3], 200=[test45, test000], 60=[test48], 750=[test0]}

我想将所有键添加到列表中,但需要根据值列表的大小添加具有多个值的键。例如,在上面的示例中,我希望将 200 添加到列表中两次,因为它的值的大小为 2。我尝试使用 ArrayList<Long> keyList = pathSizeMap.keySet() 但这只给了我键。 我怎样才能最好地使用 Java 8 个流来实现这一点?

请注意,keySet() 具体表示 Set(在没有重复条目的集合中)。这就是为什么您会得到每个密钥的一个副本。

不使用 keySet() 而是流式传输 条目 并获取每个条目的密钥:

List<Long> list = multiMap.entries().stream().map(Entry::getKey).collect(Collectors.toList());
System.out.println(list)

输出:

[100, 200, 200, 750, 50, 500, 60]

我知道您指定了流,但您实际上并不需要使用它们。

请注意 Multimap 有一个 keys() 方法。这不会折叠重复项(与 keySet() 方法不同)。它 returns 一个 Multiset(又名包)。

代码如下:

Multiset<Long> keys = multiMap.keys();

如果你想要一个列表(但听起来 Multiset 适合你的需要):

List<Long> list = ImmutableList.copyOf(keys); // or new ArrayList<>(keys);

// [100, 200, 200, 750, 50, 500, 60]
System.out.println(list);