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

Java 带有字符串和Arraylist的HashMap-错误消息,java,arraylist,hashmap,Java,Arraylist,Hashmap,我收到一条错误消息 无法对给定对象的java.util.Map.ContainsValue进行可疑调用 包含字符串的实例(ArrayList除外) 这是我正在使用的程序的一个小版本。有人能建议如何解决这个问题吗?请把密码寄出去。我不是一个优秀的程序员 import java.util.ArrayList; import java.util.HashMap; public class Main { public static void main(String[] a) { Hash

我收到一条错误消息

无法对给定对象的java.util.Map.ContainsValue进行可疑调用 包含字符串的实例(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"));
  }
}
import java.util.ArrayList;
导入java.util.HashMap;
公共班机{
公共静态void main(字符串[]a){
HashMap=newHashMap();
//put(key,newarraylist());
put(“key1”,newarraylist());
映射。获取(“键1”)。添加(“值2”);
//System.out.println(map.containsKey(“key1”);
System.out.println(映射包含值(“值2”));
}
}

你可以试试这个例子

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"})));
    }
}
import java.util.ArrayList;
导入java.util.array;
导入java.util.HashMap;
导入java.util.List;
公共班机{
公共静态void main(字符串[]a){
HashMap=newHashMap();
put(“key1”,newarraylist());
映射。获取(“键1”)。添加(“值2”);
//System.out.println(map.containsKey(“key1”);
System.out.println(map.containsValue(Arrays.asList(新字符串[]{“value2”}));
}
}

信息非常清楚。地图的值为ArrayList类型。将字符串传递给containsValue()而不是ArrayList。所以你得到了一个错误

顺便说一句,一个好习惯是以尽可能少的限制方式定义变量的类型,比如说将map声明为type map而不是HashMap

Map<String,List> map = new HashMap<String,ArrayList>();
Map Map=newhashmap();

这样,您可以根据需要以最小的涟漪效应替换不同的实现。在本例中,通过将map声明为map,您可以在将来自由地切换到TreeMap

您有一个
HashMap
,其中
String
s代表键,
ArrayList
s代表值:

HashMap<String,ArrayList> map = new HashMap<String,ArrayList>();
这很可疑。因为它不可能有那样的东西

公共类主{
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"));
        }

    }
}
公共静态void main(字符串[]a){ HashMap=newHashMap(); put(“key1”,newarraylist()); 映射。获取(“键1”)。添加(“值2”); for(列表值:map.values()){ System.out.println(value.contains(“value2”)); } } }
由于你是一个自称“不强”的程序员,我认为指出一些其他的东西会很有帮助

  • 即使在最好的情况下,这也需要测试(平均)哈希表中一半的值。如果该值不存在,那么它将测试所有这些值。如果地图中有许多条目,这将是昂贵的

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

  • 如果您实际上试图在其中一个列表中查找“value2”,那么这种方法将不起作用。你需要一个嵌套的循环;e、 g.@kingdavies解决方案。但问题是,这将更加昂贵

  • 这段代码有一点“代码味道”。如果不看真实的应用程序,我就不能确定,但是从字符串到对象列表的映射有“对象拒绝”的味道;i、 尝试使用泛型集合类型以避免创建自定义类

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