当前位置: 首页 > 知识库问答 >
问题:

将映射中的重复值映射到找到它们的键[关闭]

黄隐水
2023-03-14

想改进这个问题吗?通过编辑这篇文章添加细节并澄清问题。

我所拥有的是,

Map<String, String> map = new HashMap<>();
map.put("Shop1", "Product1");
map.put("Shop2", "Product2");
map.put("Shop3", "Product1");
map.put("Shop4", "Product2");
map.put("Shop5", "Product3");

我想要的是,

Map<String, List<String>> result = new HashMap<>();

其中,结果包含,

产品1-

产品2-

这里的Product1在Shop1商店中多次找到


共有3个答案

施德元
2023-03-14

首先找到不同的值。之后,您可以遍历每个值并在地图上搜索它们的key,每当您找到key时,您只需将它们放入列表

List<String> list = map.values().stream().distinct().collect(Collectors.toList()); //Collecting the distinct values
for (String value : list) {  //iterating through each key
    List<String> temp =  map.entrySet()
             .stream()
             .filter(entry -> value.equals(entry.getValue())) //filtering out similar entries
             .map(Map.Entry::getKey)
             .collect(Collectors.toList());
     result.put(value, temp);
 }
 System.out.println(result);
仉梓
2023-03-14

您可以使用Guava的Multimap来完成此操作。

final Map<String, String> map = new HashMap<>();
map.put("Shop1", "Product1");
map.put("Shop2", "Product2");
map.put("Shop3", "Product1");
map.put("Shop4", "Product2");
map.put("Shop5", "Product3");

final Multimap<String, String> shopToProduct = Multimaps.forMap(map), productToShop = HashMultimap.create();

Multimaps.invertFrom(shopToProduct, productToShop);

// Prints the output you want
productToShop.asMap().entrySet().forEach(System.out::println);

// You can also get the backing map, but ideally use the Multimap abstraction
final Map<String, Collection<String>> backingMap = productToShop.asMap();
翟宾实
2023-03-14

您要做的是反转贴图(值变为键,键按旧值分组)。应该有这样的库,但有一个流的示例解决方案:

result = map.entrySet()
.stream()
.filter(e -> Collections.frequency(map.values(), e.getValue()) > 1)
.collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.mapping(Map.Entry::getKey, Collectors.toList())))
 类似资料:
  • 假设我们有一个键-值映射的数据结构,其中键本身也是一个键-值映射。例如: 现在,假设我们要查询此映射中与键的某个键值子集匹配的所有顶级键/值。示例: 我们的查询是“给我所有key值,其中key包含,它将返回第一个和第三个值将返回所有同时具有和的键值,生成第二个值。显然,我们可以在每一个查询的完整地图中进行搜索,但我正在寻找比这更高效的方法。 我四处查看了一下,但是找不到一个高效、易用的C解决方案。

  • 我有2个表,即user和user_session。

  • 我在jpa/Hibernate中映射复合键时遇到了问题。父实体和子实体都具有复合主键。 在运行时保存它时会出现以下异常: 我认为这是虚假的,因为有getter和setter。如果在priceRequestLegModel上使用mappedby=“leg”,在allocationModel上使用@mapsid,也会出现同样的错误。有人能指出我在这里做错了什么吗?

  • 卡桑德拉表列: Java实体: 当执行从表列“pickuploc”中选择查询时,并没有完全映射到实体中定义的picupLocal属性。 这是我得到的回应: 使用Spring数据卡桑德拉1.5.8

  • 在这个问题的答案中,用户列出了和12个变体的值(见下文)。这些价值观从何而来?的文档没有在任何地方列出这些信息(我在这里和这里检查过)。这些字符串在Android styles.xml文件的各个地方都列出了,但是这些字符串如何映射回Roboto字体呢? 在android 4.1/4.2中,有以下Roboto字体系列可用: 与此相结合 常规 斜体 粗体 粗体斜体 光线 浅斜体 瘦 斜体 浓缩规则 缩

  • 在我的服务中,我试图将实体映射到,但是由于方法返回(),我不能像通常用于那样进行如下转换。它为方法抛出“不能在'iterable'中解析方法'stream'”错误。 那么,如何将这个实体映射到?