如何检查列表是否为hashmap中的键?



我有一个从列表到字符串的映射(键是列表)。键从int数组转换为列表。添加pair示例:

int[] arr = { 1, 2, 3, 4, 5 };
my_map.put(Arrays.asList(arr), "12345");

现在当我检查my_map是否包含其他列表时,我将总是得到null,例如:

int[] test_arr = { 1, 2, 3, 4, 5 };
if (my_map.get(Arrays.asList(test_arr)) != null) { // always null!
// do something
}

我知道问题是什么:它比较的是列表的地址,而不是值!

如何比较这些列表的值?

您提到的问题是正确的,我建议将键值替换为字符串到列表。但是,如果你坚持你的理由,你可以用你自己的类封装列表实现,并覆盖等于函数,使其基于值而不是地址。

一些地图实现允许你用比较器实例化你的地图(例如TreeMap)。

这样您就可以提供自己的实现来确定key是否相等。比较器函数返回一个int值,该值大于零,小于零,如果两个值相等则为零。

我的建议是稍微改变一点存储,以便具有相同的功能。用于检查预定义的列表是否在结构中。您不需要Map,因为它不需要添加值,只需使用List中的值。此外,更多地使用Objects而不是primitives。简单地说,List of Lists很适合这种情况。注意,List中的元素顺序很重要。如果你不在乎顺序,你可以在比较之前对两个列表进行排序。

public class TestListArr {
public static void main(String[] args) {

List<List<Integer>> list = new ArrayList<>();
Integer[] arr = { 1, 2, 3, 4, 5 };
//just check it
//int[] arr1 = {1,2,3};
//Arrays.asList(arr1).forEach(System.out::println);
//Arrays.asList(arr).forEach(System.out::println);
list.add(Arrays.asList(arr));
Integer[] test_true = { 1, 2, 3, 4, 5 };
System.out.println(check(list,test_true));
Integer[] test_false = { 1, 2, 3, 4 };
System.out.println(check(list,test_false));
//direct test
//System.out.println(Arrays.asList(arr).equals(Arrays.asList(test_true)));
}

public static boolean check(List<List<Integer>> list, Integer[] test)
{
for(List<Integer> lst:list)
{
if(lst.equals(Arrays.asList(test)))
return true;
}
return false;
}
}

输出
true
false

您正在创建的List对象只包含一个元素,一个类型为int[]的对象。int[]使用identity来测试相等性,而不是数组内容。相反,将数组内容转换为具有等效内容的列表:

static List<Integer> toList(int[] arr) {
return IntStream.of(arr).boxed().collect(Collectors.toList());
}

最新更新