Java HashMap 方法
Java HashMap 常用方法列表如下:
方法 | 描述 |
---|---|
clear() | 删除 hashMap 中的所有键/值对 |
clone() | 复制一份 hashMap |
isEmpty() | 判断 hashMap 是否为空 |
size() | 计算 hashMap 中键/值对的数量 |
put() | 将键/值对添加到 hashMap 中 |
putAll() | 将所有键/值对添加到 hashMap 中 |
putIfAbsent() | 如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中。 |
remove() | 删除 hashMap 中指定键 key 的映射关系 |
containsKey() | 检查 hashMap 中是否存在指定的 key 对应的映射关系。 |
containsValue() | 检查 hashMap 中是否存在指定的 value 对应的映射关系。 |
replace() | 替换 hashMap 中是指定的 key 对应的 value。 |
replaceAll() | 将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。 |
get() | 获取指定 key 对应对 value |
getOrDefault() | 获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值 |
forEach() | 对 hashMap 中的每个映射执行指定的操作。 |
entrySet() | 返回 hashMap 中所有映射项的集合集合视图。 |
keySet() | 返回 hashMap 中所有 key 组成的集合视图。 |
values() | 返回 hashMap 中存在的所有 value 值。 |
merge() | 添加键值对到 hashMap 中 |
compute() | 对 hashMap 中指定 key 的值进行重新计算 |
computeIfAbsent() | 对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中 |
computeIfPresent() | 对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。 |
哈希表解相同字母
<!--`//对应字母出现则增加`-->
<!--`table[s.charAt(i) - 'a']++;`-->
有效的字母异位词(242)
思路
1.判断两个字符串长度是否相等,不相等则直接返回 false
2.相等,初始化 26 个字母哈希表,遍历字符串 s 和 t
3.s
负责在对应位置增加,t 负责在对应位置减少
4.如果哈希表的值都为 0,则二者是字母异位词
代码
public boolean isAnagram(String s, String t) {
int m = s.length(),n = t.length();
if(m != n) {
return false;
}
// char[] str1 = s.toCharArray();
// char[] str2 = t.toCharArray();
// Arrays.sort(str1);
// Arrays.sort(str2);
// return Arrays.equals(str1, str2);
//table数组用于统计a-z出现的次数
int[] table = new int[26];
for(int i = 0; i < m; i++) {
//s.charAt(i) - 'a'将字符'a'映射到索引0,将abcd....都映射到索引为0-25
//对应字母出现则增加
table[s.charAt(i) - 'a']++;
}
for(int j = 0; j < n; j++) {
//对应字母出现则减少
table[t.charAt(j) - 'a']--;
//移除减少的时候如果出现了负数说明有t有s没有的字母
if(table[t.charAt(j) - 'a'] < 0) {
return false;
}
}
return true;
}
赎金信383
思路
同上
代码
public boolean canConstruct(String ransomNote, String magazine) {
int[] table = new int[26];
for(int i = 0; i < magazine.length(); i++) {
table[magazine.charAt(i) - 'a']++;
}
for(int i = 0; i < ransomNote.length(); i++) {
table[ransomNote.charAt(i) - 'a']--;
if(table[ransomNote.charAt(i) - 'a'] < 0) {
return false;
}
}
return true;
}
哈希表set
快乐数(202)
思路
代码
class Solution {
private int getNext(int n) {
int total = 0 ;
while(n > 0) {
int d = n % 10;
n = n / 10;
total += d * d;
}
return total;
}
public boolean isHappy(int n) {
//去重
Set<Integer> res = new HashSet<>();
//res.contains(n)保证没有重复的重复说明进入了循环
while(n != 1 && !res.contains(n)) {
//将拆开的数的平方和入哈希表
res.add(n);
//调用求和直到和为1
n = getNext(n);
}
return n==1;
}
}
两个数组的交集(349)
思路
1.利用set去重数组
2.遍历2的时候用1进行配对,是否有相同的
3.相同的添加到setRes里面存储
4.新建一个数组将setRes里面的元素遍历添加到数组中
代码
public int[] intersection(int[] nums1, int[] nums2) {
if(nums1 == null || nums2 ==null) {
return new int[0];
}
//存储nums12的数据
Set<Integer> set1 = new HashSet<Integer>();
//存储集合结果
Set<Integer> setRes = new HashSet<Integer>();
//遍历nums1,并将nums1的数据去重添加到set1
for(int i : nums1) {
set1.add(i);
}
//遍历数组nums2,并判断nums1中有的2中是否有
for(int i : nums2) {
if(set1.contains(i)) {
setRes.add(i);
}
}
//创建一个数组存放集合(两个数组都含有的元素)
int [] resArr = new int[setRes.size()];
int index = 0;
for(int i : setRes) {
resArr[index++] = i;
}
return resArr;
}
哈希表Map
两数之合
思路
1.利用Map将nums
数组存在key中,下标索引存储在value中
2.用map.containsKey(target - nums[i])
找出key中是否有另外一个值
3.get()
获取key对应的value
代码
public int[] twoSum(int[] nums, int target) {
// for(int i = 0; i < nums.length; i++) {
// for(int j = i+1; j < nums.length; j++) {
// if(nums[i] + nums[j] == target) {
// return new int[] {i,j};
// }
// }
// }
// return new int[0];
Map<Integer,Integer> map =new HashMap<Integer,Integer>();
for(int i =0; i < nums.length; i++) {
if(map.containsKey(target - nums[i])) {
return new int[] {map.get(target - nums[i]),i};
}
//key表示数组元素nums里面的元素,value表示索引下标
map.put(nums[i], i);
}
return new int[0];
}
四数相加454
思路
1.分成两组,先计算nums1+nums2
数组中各个元素的和
2.把元素和存储到哈希表map的key中,用value记录每个结果出现的次数map.getOrDefault(i+j, 0)+1
每出现一次加1
3.遍历3 4,在哈希表map中寻找减去nums3+nums4
数组中的元素的map中的key中的元素,返回对应的key的value值,记录下来,记录每一次瞒足的结果,及是瞒足四数相加的次数。
代码
public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
//遍历nums1 nums2,两个数组里面的元素相加作为key,出现的次数作为value
for(int i : nums1) {
for(int j : nums2) {
//i+j是key值,1 2元素的所有可能的和集合
//map.getOrDefault(i+j, 0)+1用来记录同一个字符出现的次数,每出现一次那么就+1。
map.put(i+j,map.getOrDefault(i+j, 0)+1);
}
}
int ans = 0;
for(int i : nums3) {
for(int j : nums4) {
//containsKey(-i-j) map中是否存在key的映射关系,及存在 3 4的和的负数和 1 2相等
if(map.containsKey(-i-j)) {
//get(-i-j) 获取(i+j)对应的value值及出现的次数
ans += map.get(-i-j);
}
}
}
return ans;
}