带字符串和Arraylist的HashMap - 错误消息

时间:2011-04-23 02:02:44

标签: java arraylist hashmap

我收到错误消息。

  

对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"));
  }
}

5 个答案:

答案 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而不是HashMap

Map<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)

由于你是一位自称“不强大”的程序员,我认为指出其他一些事情会很有帮助。

  1. 即使在最好的情况下,这也会涉及测试(平均)散列表中一半的值。如果该值不存在,那么它将测试所有这些值。如果地图中有许多条目,这将是昂贵的。

  2. 请记住,列表的相等性定义为使用Object.equals(Object)对列表元素进行成对测试。

  3. 如果您实际上试图在其中一个列表中找到“value2”,则此方法将无效。你需要一个嵌套循环;例如@kingdavies解决方案。但重点是,这将更加昂贵。

  4. 此代码段中有一些“代码味道”的提示。我不能确定没有看到真正的应用程序,但从String到对象列表的映射气味“对象拒绝”;即尝试使用泛型集合类型以避免创建自定义类。