搜索指定的键和值是否存在

时间:2013-06-25 04:53:40

标签: java hashmap

我正在使用java中的hashmap datastructure。我有一些数据,其中每个条目(值)都有一个组(键)。现在我将这些数据存储在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");

现在我想搜索是否在地图中存在条目(键= 3和值=“value6”)。有没有具体的方法可以打电话?还是有其他方式去做?

7 个答案:

答案 0 :(得分:8)

您无法在地图中针对相同的密钥保留多个条目。如果您的地图以前包含该键的映射,则替换旧值。你需要

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

在哪里可以保存相同键的字符串列表。你可以通过map#get

获得价值
List<String> str = map.get(3);

答案 1 :(得分:4)

您可以使用Guava MultimapAPI 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");

这将为您创建数据结构

  

现在我想搜索条目(键= 3和值=“value6”)是否存在   在地图与否。有没有具体的方法可以打电话?或者在那里   其他方式吗?

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

因此,

myMultimap.containsEntry(3,"value6")

将返回true

答案 2 :(得分:1)

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

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

所以,value6不再存在。

答案 3 :(得分:1)

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

其次,你实际上正在粉碎你的价值观。地图只会为每个键存储一个值。如果要存储多个值,请考虑使用另一个集合作为值,您可以在以后添加值。

以下是一些示例代码:

//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);
}

答案 4 :(得分:1)

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

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>())) {
      ...
    }

答案 5 :(得分: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)以适合事物,并且/或者将该函数转换为可以适合任何控制结构的单个条件(如果需要)。

答案 6 :(得分:0)

map只存储唯一键,你将3存储为键,将value6存储为值,然后再将3作为键,将值7作为值存储,然后地图仅将3作为键,将值7作为值value6将被替换