我正在使用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”)。有没有具体的方法可以打电话?还是有其他方式去做?
答案 0 :(得分:8)
您无法在地图中针对相同的密钥保留多个条目。如果您的地图以前包含该键的映射,则替换旧值。你需要
Map<Integer,List<String>> map = new HashMap<>();
^^^^^
(Diamond operator)
在哪里可以保存相同键的字符串列表。你可以通过map#get
List<String> str = map.get(3);
答案 1 :(得分:4)
您可以使用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");
这将为您创建数据结构
现在我想搜索条目(键= 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将被替换