我有一个HashMap,其中包含各种“产品”作为键和“产品组ID”作为值。 我需要分离出具有相同组ID的产品,并将它们放入新的ArrayList(仅包含产品,即键)中。 我对如何做到这一点感到困惑,任何帮助将不胜感激!
类似这样的事情: HashMap:(1,a)(2,b)(3,c)(4,a)(5,b) 新的ArrayList应该包含:{1,4}-此列表被发送到另一个函数进行处理。 同样,应将2,5存储在另一个列表中并进行处理。 最后,应该将3存储在数组列表中并进行处理。
答案 0 :(得分:2)
您可以使用的另一种方法是在HashMap
中添加另一个ArrayLists
,然后为其添加值。您可以尝试以下代码:
我假设Product是一个字符串,并且ID是一个整数,但是您可以更改它。
Map < Integer, String > sourceMap = Map.of ( 1 , "a" , 2 , "b" , 3 , "c" , 4 , "a " , 5 , "b" );
HashMap <String, ArrayList<Integer>> result = new HashMap<>();
for (Map.Entry <Integer, String> entry : sourceMap.entrySet()) {
String value = entry.getValue();
int key = entry.getKey();
if (result.containsKey(value)) {
ArrayList<Integer>temp = result.get(value);
temp.add(key);
} else {
ArrayList<Integer> temp = new ArrayList<>();
temp.add(key);
result.put(value, temp);
}
}
System.out.println ("result.toString():\n" + result);
现在,您有一个名为HashMap
的{{1}},其中包含您想要的result
。您可以遍历以获取每个ArrayList
。
答案 1 :(得分:1)
我建议使用以下模式。
假设您有一个简单的HashMap<String, String>
。然后,您可以执行以下操作:
Map<String, List<String>> result = map.entrySet().stream().collect(
Collectors.groupingBy(e -> e.getValue(),
Collectors.mapping(e -> e.getKey(), Collectors.toList()))
)
结果是:{a=[1, 4], b=[2, 5], c=[3]}
result.get("a")
可以简单地访问列表,依此类推。
答案 2 :(得分:0)
我认为您需要这样的东西:
private static Map<Product, Long> map = new HashMap<>();
public static void main(String[] args) {
fillTestData();
List<Product> products = findProductByGroup(1L);
System.out.println(products.size());
}
private static List<Product> findProductByGroup(Long groupId){
return map.entrySet().stream()
.filter(entry -> entry.getValue() == groupId)
.map(Entry::getKey)
.collect(Collectors.toList());
}
private static void fillTestData() {
String product = "product";
long groupId = 0;
for(int i = 0; i < 100; i++) {
if(i % 2 == 0) {
groupId = 1;
}else {
groupId = 2;
}
map.put(new Product(product+i), groupId);
}
}
否则,您已经明确声明了您的需求