【问题标题】:How to check if a list is a key in hashmap?如何检查列表是否是哈希图中的键?
【发布时间】:2021-10-20 04:16:05
【问题描述】:

我有一个从 List 到 String 的映射(键是列表)。 键从 int 数组转换为列表。 添加一对示例:

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

}

我知道问题出在哪里:它是在比较列表的地址,而不是值!

如何比较这些列表值?

【问题讨论】:

    标签: java list hashmap key-value


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我的建议是稍微更改存储以具有相同的功能。检查预定义列表是否在结构内的方法。 您不需要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
      

      【讨论】:

        【解决方案3】:

        一些地图实现允许您使用 Comparator 实例化您的地图(例如TreeMap)。

        通过这种方式,您可以提供自己的实现来确定键是否相等。 您的比较器函数返回一个 int,其值大于零、小于零或如果两个值相等则为零。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 谢谢。最后我将键替换为字符串(而不是列表),并使用“等于”来比较键。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-30
          • 2015-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-13
          • 2012-04-05
          相关资源
          最近更新 更多