欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 明星 > 哈希map中不能将数组作为键的原因 leetcode49

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

2025/6/13 19:01:05 来源:https://blog.csdn.net/red_Apple_3_11/article/details/148511884  浏览:    关键词:哈希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());}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词