当前位置: 首页 > backend >正文

哈希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());}
}

http://www.xdnf.cn/news/12903.html

相关文章:

  • 第二十八章 字符串与数字
  • 5G-A通感融合对监控监督体系的核心作用
  • 下一代设备健康管理解决方案:基于多源异构数据融合的智能运维架构
  • AD规则设置-铜皮规则,阻焊规则,实时DRC
  • 栈和队列的奇妙冒险:用栈实现队列
  • 6个月Python学习计划 Day 17 - 继承、多态与魔术方法
  • 快速上手Linux文本流编辑器sed
  • 智慧城市项目总体建设方案(Word700页+)
  • 基于深度强化学习的智能机器人导航系统
  • 黑马Javaweb Request和Response
  • 05.查询表
  • 【无人机】地面站crazyfile-cfclient免安装方法,Python3.10的整体环境配置打包
  • OCS2库及其在足式机器人上的应用
  • RK3568项目(七)--uboot系统之外设与PMIC详解
  • 真实案例分享,Augment Code和Cursor那个比较好用?
  • PDF 转 Word 工具 拖拽秒转可编辑文档,批量处理保留原格式
  • 用通俗的话解释下MCP是个啥?
  • android 模拟器如何进行单模块更新
  • 【设计模式】1.简单工厂、工厂、抽象工厂模式
  • ORACLE 修改端口号之后无法启动?
  • 港理工:LLM推理与推荐能力集成
  • ElGamal加密算法:离散对数难题的安全基石
  • (五)Linux性能优化-CPU-性能优化
  • GitOps 核心思想 - 当 Git 成为唯一信源
  • 2025-04-22-X86 架构与 Arm 架构异同及应用
  • Keil Mdk新建stm32工程找不到对应芯片开发包的解决方法
  • LeetCode - 148. 排序链表
  • Jupyter notebook的文章结构目录查看方式和汉化方法
  • 基于Matlab肺结节分割(肺结节提取)源程序,也有GUI人机界面版本。使用传统图像分割方法,非深度学习方法。使用LIDC-IDRI数据集。
  • RoseMirrorHA 双机热备全解析