HashMap存的是键值对(key-value),通过key可以唯一获取value。键值是否相同是通过两个函数确定的,分别是hashCode()和equals()。hashCode()确定了键值对存放的位置,equals()确定了两个对象是否相同。通常常见数据类型都是重写了hashCode()和equals()方法。例如HashMap存的键是String类型,那么只要字符串的值相同时,就可以看作是同一个键。例如下面一个例子:

AcWing3814. 矩阵变换

给定一个的 矩阵。

你可以选择若干列(也可以不选),并将这些列上的所有元素进行变换(变 ,变 )。

你的目标是使得矩阵中有尽可能多的行满足:一行中的所有元素都为 。

输出可以得到的满足条件的行的最大数量。

 思路
:分析题目可以得知,各行数据形成的字符串的最多的那个字符串就是满足条件的最大数量,所以想到使用哈希表来存,键就是01字符串,值是字符串相应的个数。而我们知道每个字符串对象是不相同的,所以存完之后各个键对应的值都是1。但是String类重写了hashCode()和equals()方法,在HashMap以String为键时,只要字符串的值相同,那么键就相同了,所以可以用来计数。

代码(Java)
import java.util.*; class Main { public static void main(String[] args) {
Scanner sc = new Scanner(System.in); int n = sc.nextInt(); Map<String,Integer>
map = new HashMap<>(); for(int i = 0;i < n;i++) { String s = sc.next();
map.put(s,map.getOrDefault(s,0) + 1); } int res = 0; for(Map.Entry
e:map.entrySet()) { res = Math.max(res,(int)e.getValue()); }
System.out.println(res); } }

但是当我们使用别的类的对象作为键,例如将自己写的类作为键时,那么每个对象都是不相同的,此时就无法使用HashMap来计数。如果要产生计数功能,那么就要对自己的类,重写hashCode()和equals()方法。例如一个Person类,只要这个类的对象的id是相同的,那么就是同一个对象,从而可以作为键。此时就将该条件写入以上两个方法中。
public class Person { private String id; public Person(String id) { this.id =
id; } @Override public boolean equals(Object o) { if (this == o) return true;
//同一个对象直接返回true if (o == null || getClass() != o.getClass()) return false;
//o为空或者两者生成类不一致,直接返回false Person person = (Person) o;
//两者id一个为空,另一个不为空,返回false;两个都不为空,但是值不一样返回false if (id != null ?
!id.equals(person.id) : person.id != null) return false; return true; }
@Override public int hashCode() { return id != null ? id.hashCode() : 0; } }

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信