哈希map中不能将数组作为键的原因 leetcode49

发布于:2025-06-09 ⋅ 阅读:(13) ⋅ 点赞:(0)

 由leetcode49得来

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母
package Hash;

import com.sun.nio.file.SensitivityWatchEventModifier;

import java.lang.reflect.Array;
import java.util.*;

/**
 * @Description: 字母异位词分组
 * @Author: wangKai
 * @Date: 2025/6/8 12:28
 */
public class Solution49 {
    public List<List<String>> groupAnagrams(String[] strs) {

        
        HashMap<char[],List<String>> hashMap = new HashMap<>();


        for (int i = 0; i <strs.length; i++) {
            char[] a = strs[i].toCharArray();
            Arrays.sort(a);
            if (hashMap.containsKey(a)){
                hashMap.get(a).add(strs[i]);
            }else {
                List<String> list = new ArrayList<>();
                list.add(strs[i]);
                hashMap.put(a,list);
            }
        }
        return new ArrayList<>(hashMap.values());
    }
}

 

输出错误,可以看到,hashmap没有起到分组的多用

分析原因

由于

        1使用数组(char[])作为 HashMap 的键。由于数组的 equals() 和 hashCode() 方法是基于引用而非内容的,即使两个数组内容相同,它们也会被视为不同的键,导致无法正确分组字母异位词

 此时应该将键替换为String类型的,它们的equals()hashCode()方法基于内容实现.

       2 另外 a.toString() 对数组直接调用 toString(),返回的是 数组类型和内存地址(格式为 [C@哈希值]),而非数组内容。

此时可以使用

class Solution {
  public List<List<String>> groupAnagrams(String[] strs){
        HashMap<String,List<String>> hashMap = new HashMap();
        for (int i = 0; i <strs.length ; i++) {
            char[] temp = strs[i].toCharArray();   //将字符串转为字符数组
            Arrays.sort(temp);                       //字符数组排序

            //在hashmap中查询有没有该排好序的字符串
              List<String> list  =  hashMap.getOrDefault(new String(temp),new ArrayList<>());
              //在list集合中放入刚弄出来的字符串
              list.add(strs[i]);
              hashMap.put(new String(temp),list);
        }
        return new ArrayList<>(hashMap.values());
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到