5

我正在使用 java 中的 hashmap 数据结构。我有一些数据,其中每个条目(值)都有一个组(键)。现在我将这些数据存储在哈希图中,如下所示

HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "value1");
map.put(1, "value2");
map.put(2, "value3");
map.put(2, "value4");
map.put(3, "value5");
map.put(3, "value6");
map.put(3, "value7");

现在我想搜索地图中是否存在条目(key=3 和 value="value6")。有什么具体的方法可以调用吗?还是有其他方法可以做到这一点?

4

7 回答 7

9

您不能在地图中针对同一个键保留多个条目。如果您的映射先前包含该键的映射,则旧值将被替换。你需要

Map<Integer,List<String>> map = new HashMap<>();
                                          ^^^^^
                                     (Diamond operator)

您可以将字符串列表保存在同一键的位置。你可以通过map#get

List<String> str = map.get(3);
于 2013-06-25T04:55:00.377 回答
5

您可以使用Guava Multimap ( API docs )

它针对一个键存储多个值。对于你的情况,

Multimap<Integer,String> myMultimap = ArrayListMultimap.create();
myMultimap .put(1, "value1");
myMultimap .put(1, "value2");
myMultimap .put(2, "value3");
myMultimap .put(2, "value4");
myMultimap .put(3, "value5");
myMultimap .put(3, "value6");
myMultimap .put(3, "value7");

这将为您创建数据结构

现在我想搜索地图中是否存在条目(key=3 和 value="value6")。有什么具体的方法可以调用吗?还是有其他方法可以做到这一点?

搜索使用multimap#containsEntry(key,value),它boolean根据结果返回结果

所以,

myMultimap.containsEntry(3,"value6")

这将返回true

于 2013-06-25T05:12:04.647 回答
3

从广义上讲: map.get(key)将检索此键位置的值,或者null如果它不存在。

其次,你实际上是在破坏你的价值观。Maps 只为每个键存储一个值。如果要存储多个值,请考虑使用另一个集合作为值,稍后您可以将值添加到其中。

这是一些示例代码:

//Declaration - change List to Set if duplicates are annoying
Map<Integer, List<String>> map = new HashMap<>();

//Usage - if the list is empty at the key, new one up.  Append the value afterwards.
Integer key = Integer.valueOf(1);
List<String> values = map.get(key);
if(key == null) {
     values = new ArrayList<>();
}
values.add("word");
map.put(key, values);

确定特定键的值的存在也变得很容易:

public boolean inMap(Map<Integer, List<String>> map, Integer key, String value) {
    final List<String> values = map.get(key);
    return values != null && values.contains(value);
}
于 2013-06-25T05:09:04.970 回答
2

您的键仅包含put()特定键的最后一个值,因为每个键的值都被覆盖,并且只有最后输入的值存储在Entry对象中的键上。根据您的代码,您的地图包含以下形式的键值对:

{1=value2, 2=value4, 3=value7}

所以,value6已经不存在了。

于 2013-06-25T05:07:54.063 回答
2

看起来你需要一组对而不是地图。

Set 是库类。例如,您可以使用 HashSet。对不是。您可以使用http://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/tuple/Pair.html

所以,

    // init
    Set<Pair<Integer, String>> set = new HashSet<Pair<Integer, String>>();
    set.add(new Pair<Integer, String>(1, "1"));

    // check
    if (set.contains(new Pair<Integer, String>())) {
      ...
    }
于 2013-06-25T05:16:46.813 回答
1

map 仅存储唯一键,您已将 3 作为键和 value6 作为值存储,然后再次将 3 作为键和 value7 作为值,然后您的地图仅包含 3 作为键和 value7 作为值 value6 将被替换

于 2013-06-25T04:56:41.733 回答
1

您可以通过获取所需键的值并通过将其与值进行比较来了解是否存在键对值。

示例(Java 7 及更高版本):

boolean exists(Map<K,V> map, K key, V value)
{
  return map!=null && map.get(key)!=null && Objects.equals(map.get(key),value);
}

boolean existsinList(Map<K,V> map, K key, V value)
{
  return map!=null && map.get(key)!=null && map.get(key).contains(value);
}

已包括所有必要的检查。可以分析、删除或修改条件(例如 map!=null)以根据其用例适合事物和/或将此函数转换为可以适合任何控制结构的单个条件(如果需要)。

于 2020-05-04T16:02:23.177 回答