哈希map中不能将数组作为键的原因 leetcode49
由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());}
}