我收到错误消息。
对java.util.Map.ContainsValue的可疑调用给定对象不能 包含String的实例(ArrayList除外)
这是我正在使用的程序的一个小版本。有人可以建议如何解决这个问题吗?请发布代码。我不是一个强大的程序员。
import java.util.ArrayList;
import java.util.HashMap;
public class Main {
public static void main(String[] a) {
HashMap<String,ArrayList> map = new HashMap<String,ArrayList>();
//hashMap.put(key, new ArrayList());
map.put("key1", new ArrayList());
map.get("key1").add("value2");
//System.out.println(map.containsKey("key1"));
System.out.println(map.containsValue("value2"));
}
}
答案 0 :(得分:3)
您有一个HashMap
的密钥为String
,价值为ArrayList
:
HashMap<String,ArrayList> map = new HashMap<String,ArrayList>();
然后尝试查看它是否包含String
System.out.println(map.containsValue("value2"));
这非常可疑。因为它不可能有那个。
答案 1 :(得分:1)
你可以尝试这个例子,
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
public class Main {
public static void main(String[] a) {
HashMap<String, List<String>> map = new HashMap<String, List<String>>();
map.put("key1", new ArrayList());
map.get("key1").add("value2");
// System.out.println(map.containsKey("key1"));
System.out.println(map.containsValue(Arrays.asList(new String[]{"value2"})));
}
}
答案 2 :(得分:0)
信息很清楚。地图的值是ArrayList类型。您将String传递给containsValue()而不是ArrayList。所以你得到一个错误。
BTW,进入的一个好习惯是以尽可能限制的方式定义变量的类型,比如将map声明为Map而不是HashMapMap<String,List> map = new HashMap<String,ArrayList>();
通过这种方式,您可以根据需要替换不同的实现,并产生最小的连锁效应。在这种情况下,通过将map声明为Map,您可以在将来自由切换到TreeMap。
答案 3 :(得分:0)
public class Main {
public static void main(String[] a) {
HashMap<String, List<String>> map = new HashMap<String, List<String>>();
map.put("key1", new ArrayList());
map.get("key1").add("value2");
for (List<String> value : map.values()) {
System.out.println(value.contains("value2"));
}
}
}
答案 4 :(得分:0)
由于你是一位自称“不强大”的程序员,我认为指出其他一些事情会很有帮助。
即使在最好的情况下,这也会涉及测试(平均)散列表中一半的值。如果该值不存在,那么它将测试所有这些值。如果地图中有许多条目,这将是昂贵的。
请记住,列表的相等性定义为使用Object.equals(Object)
对列表元素进行成对测试。
如果您实际上试图在其中一个列表中找到“value2”,则此方法将无效。你需要一个嵌套循环;例如@kingdavies解决方案。但重点是,这将更加昂贵。
此代码段中有一些“代码味道”的提示。我不能确定没有看到真正的应用程序,但从String到对象列表的映射气味“对象拒绝”;即尝试使用泛型集合类型以避免创建自定义类。