当前位置: 首页 > 面试题库 >

Java:如何在哈希图中获取具有相同值的键集

谷梁俊楚
2023-03-14
问题内容

我有一个哈希图,如下所示:

1-> x

2-> y

3-> x

4-> z

现在我想知道所有值为x的键(ans:[1,3])。最好的方法是什么?

蛮力方式是仅遍历map并将所有键存储在值为x的数组中。

有什么有效的方法吗?

谢谢


问题答案:

您可以使用MultiMap轻松获取所有这些重复的值。

Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "x");
map.put(2, "y");
map.put(2, "z");
map.put(3, "x");
map.put(4, "y");
map.put(5, "z");
map.put(6, "x");
map.put(7, "y");

System.out.println("Original map: " + map);

Multimap<String, Integer> multiMap = HashMultimap.create();
for (Entry<Integer, String> entry : map.entrySet()) {
  multiMap.put(entry.getValue(), entry.getKey());
}
System.out.println();

for (Entry<String, Collection<Integer>> entry : multiMap.asMap().entrySet()) {
  System.out.println("Original value: " + entry.getKey() + " was mapped to keys: "
      + entry.getValue());
}

打印输出:

Original map: {1=x, 2=z, 3=x, 4=y, 5=z, 6=x, 7=y}

Original value: z was mapped to keys: [2, 5]
Original value: y was mapped to keys: [4, 7]
Original value: x was mapped to keys: [1, 3, 6]

每@ noahz 的建议,forMapinvertFrom需要更少的线,但可以说是更加复杂的阅读:

HashMultimap<String, Integer> multiMap =
    Multimaps.invertFrom(Multimaps.forMap(map), 
        HashMultimap.<String, Integer> create());

代替:

Multimap<String, Integer> multiMap = HashMultimap.create();
for (Entry<Integer, String> entry : map.entrySet()) {
  multiMap.put(entry.getValue(), entry.getKey());
}


 类似资料:
  • 我会从我想达到的目标开始 意图 该软件在for循环中解析XML数据。处理数据的 for 循环将持续到 50(因为我得到了 50 个不同的结果)。我最初所做的是,-方法解析整个XML数据并将其保存到TextViews中并显示它。但现在我想添加一个启动画面,只要数据加载就会显示。 XML文件像任何其他普通XML文件一样构建,因此当我通过for循环时,键总是相同的,但值不同。 方法 我已经做的是创建一个

  • 问题内容: 我有一些键指向相同值的哈希图。我想找到所有相等的值并打印相应的键。 这是我目前的代码: 当前代码将重复项两次添加到列表中,但是也会将每个键一次添加一次。 谢谢。 问题答案: 您可以使用流以这种方式检索重复项: 然后,您可以使用以下命令将其打印出来:

  • 问题内容: 如果我想找出两个键中是否没有一个键与另一个键不同,并且该键的值彼此匹配,如何最好地比较两个键。 将A与B进行比较时,由于B和D键的不同,它应该会失败。 如何最好地比较未排序的哈希图? 问题答案: 做一个支票上两者秒。 注意: 如果您包含键,那没有问题,但是如果您的Map包含类型键,则需要确保您的类实现了。

  • 我有两个哈希要合并。它们看起来像这样: 第二个散列看起来像: 我想合并这两个散列数组,结果如下所示: 有没有一种简单的方法来合并这两个哈希,或者我必须逐个遍历哈希并在另一个哈希中找到该键?

  • 我正在使用BCryptPasswordEncoder使用spring security。现在对于更改密码,我需要做的是比较用户提供的现有密码和DB值。 但是由于salt是由动态生成的,所以每次我从下面的方法得到不同的散列值,并且不一定会与我的DB值匹配。 解决这个问题的办法是什么?我能识别用于我的DB字段的盐并在上面的方法中使用相同的盐吗?

  • 我在Spring和Redis上都很新。我想知道有没有办法按价值得到钥匙? 例如,我希望获得具有给定文件哈希和内容的图像类型文件的get the KEY。我是这样做的: 然而,我被告知这是相当昂贵的,因为我要获得所有以“image”开头的键,并手动检查所有这些键。 现在我在想,也许如果我能按价值得到钥匙会好得多。以便更容易得到它的所有属性。在Redis可能吗?