网站正在建设中html,炫富做图网站,电商怎么做视频教程,263官网首页目录Map接口实现类的特点Map接口的常见方法Map六大遍历方式Map练习1code编程练习2code编程练习3思路codeMap接口实现类的特点
Map与Collection并列存在#xff0c;是Map集合体系的顶级接口Map的有些子实现存储数据是有序的(LinkedHashMap)#xff0c;有些子实现存储数据是无…
目录Map接口实现类的特点Map接口的常见方法Map六大遍历方式Map练习1code编程练习2code编程练习3思路codeMap接口实现类的特点
Map与Collection并列存在是Map集合体系的顶级接口Map的有些子实现存储数据是有序的(LinkedHashMap)有些子实现存储数据是无序的(HashMap)用于保存具有映射关系的数据Key-Value。key和value之间存在单向一对一关系即通过指定的key总能找到对应的valueMap中的key和value可以是任何引用类型的数据Map中的key不允许重复原因和HashSet一样Map中的value可以重复Map的有些子实现允许存储null作为key(比如HashMap)有些子实现不允许存储null作为key(比如TreeMap)Map的key可以为nullvalue也可以为null但是key为null只能有一个value 为null可以多个常用String类作为Map的key
package cs.kaoyan.javase.com.map;import java.util.HashMap;
import java.util.Map;public class Test1 {public static void main(String[] args) {Map map new HashMap();map.put(no1,zhang san);map.put(no2,li si);map.put(no1,wang wu);//可以加入,会替换no1的zhang sanmap.put(no3,wang wu);//no.不同,可以加入//{no2li si, no1wang wu, no3wang wu}System.out.println(map);map.put(null,null);//null作为key唯一,所以会替换上面作为value的nullmap.put(null,abc);//null作为value可以有多个map.put(no4,null);map.put(no5,null);//{no2li si, nullabc, no1wang wu, no4null, no3wang wu, no5null}System.out.println(map);//get方法,传入key,会返回对应的value//li siSystem.out.println(map.get(no2));//wang wuSystem.out.println(map.get(no3));}
}
Map接口的常见方法
package cs.kaoyan.javase.com.map;import java.util.HashMap;
import java.util.Map;public class Test3 {public static void main(String[] args) {Map map new HashMap();map.put(zhang san,18);map.put(li si,19);map.put(wang wu,20);map.put(zhao liu,21);map.put(xiao qi,22);map.put(chang feng,23);map.put(tian ming,24);// 7System.out.println(map.size());//remove:根据键删除映射关系map.remove(li si);//get: 根据键获取值//22System.out.println(map.get(xiao qi));// 6System.out.println(map.size());//FalseSystem.out.println(map.isEmpty());//TrueSystem.out.println(map.containsKey(tian ming));//清空map.clear();// 0System.out.println(map.size());}
}
Map六大遍历方式
Map不是Iterable的子接口也就意味着Map没有Iterator方法所以Map没有办法法直接调用foreach循环
containsKey查找键是否存在containsValue查找值是否存在keySet获取所有的键(获得map中key的集合视图)values获取所有的值(获得map中value的集合视图)entrySet获取所有关系(获得键值对集合)get: 根据键获取值
Map练习1 假设Map中存储了一批StringUser类型的key-value用户信息删除User的age是18岁的同学 code
package cs.kaoyan.javase.com.map;import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;/**** 假设Map中存储了一批String,User类型的key-value用户信息* 删除User的age是18岁的同学*/public class Test5 {public static void main(String[] args) {MapString, User map new HashMap();map.put(zs, new User(zs, 18));map.put(ls, new User(ls, 19));map.put(wu, new User(wu, 20));map.put(zl, new User(zl, 21));map.put(aa, new User(aa, 18));//删除User的age是18岁的同学//不可以一边遍历,一边删除,不然会出现并发修改异常ConcurrentModificationException//先获得key,再通过key获得valueArrayList list new ArrayList();SetString allKey map.keySet();for (String key : allKey) {//通过key会返回一个user对象User user map.get(key);if (user.age 18){//将所有年龄为18的对象的key存入list之中list.add(key);}}//遍历list,删除keyfor (Object o : list) {map.remove(o);}//{zlUser{zl,21}, lsUser{ls,19}, wuUser{wu,20}}System.out.println(map);}
}编程练习2 给定一个整数数组和一个目标值找出数组中和为目标值的两个数, 返回它们的索引。 你可以假设每个输入只对应一种答案且同样的元素不能被重复利用。 比如nums [2, 7, 11, 15], target 9. 因为 nums[0] nums[1] 2 7 9. 所以返回 [0, 1]. code
package cs.kaoyan.javase.com.map;import java.util.Arrays;public class Test6 {public static void main(String[] args) {int[] ints {2,7,11,15};//answer数组用来存储答案int[] answer {0,0};int target 9;//方法一暴力算法,时间复杂度O(n*n)/*for (int i 0; i 3; i) {for (int j 0; j 3; j) {if (ints[i] ints[j] target){answer[0] i;answer[1] j;}}}System.out.println(answer[0] answer[1]);*///方法二二分算法,时间复杂度O(nlogn)//二分需要保证数组有序(数组本身已经有序,可以不写)Arrays.sort(ints);int size ints.length;for (int i 0; i size; i) {//在长度为size的数组ints中,找到元素target - ints[i]所在的下标int index2 binarySearch(ints, size, target - ints[i]);if (index2 ! -1){//存在两数之和等于targetanswer[0] i;answer[1] index2;//假设只有一组答案,满足即可结束循环break;}}System.out.println(answer[0] answer[1]);}/*** 查找元素x在数组a的下标* param a:表示数组* param n表示数组的长度* param x表示要查找的目标元素* returnx在数组a的下标*/public static int binarySearch(int a[],int n,int x) {int L 0;int R n - 1;//ans用来记录查找要查找元素的下标(一般设置为负数)int ans -1;//二分查找条件:L Rwhile (L R) {int Mid (L R) 1;if (a[Mid] x) {//查找到目标元素ans Mid;break;}if (a[Mid] x) {L Mid 1;} else {R Mid - 1;}}//如果返回-1说明未找到要查找的目标元素xreturn ans;}
}编程练习3 给你一份『词汇表』(字符串数组)words和一张『字母表』(字符串)chars。 假如你可以用chars中的『字母』(字符)拼写出words中的某个『单词』(字符串)那么我们就认为你掌握了这个单词。注意每次拼写时chars中的每个字母都只能用一次。返回词汇表words中你掌握的所有单词的长度之和。 示例 1 输入words [“cat”,“bt”,“hat”,“tree”], chars “atach” 输出6 解释可以形成字符串 “cat” 和 “hat”所以答案是 3 3 6。 示例 2 输入words [“hello”,“world”,“leetcode”], chars “welldonehoneyr” 输出10 解释可以形成字符串 “hello” 和 “world”所以答案是 5 5 10。 思路
参考博客 遇到字符串仅包含小写(或者大写)英文字母的题都可以试着考虑构造长度为26的数组。这样数组每个位置分别代表一个字母统计出字母出现的次数。本题中既要统计字母表中字母出现的次数也要统计单词中字母出现的次数。如果字母表中字母出现的次数大于等于单词中每种字母出现的次数那么这个单词就可以由字母表拼写出来。以字母表 atach和 词汇cat为例过程图示如下
code
package cs.kaoyan.javase.com.map;public class Test7 {public static void main(String[] args) {String[] words {hello,world,leetcode};String chars welldonehoneyr;int sum1 countAllWordsLength(words, chars);System.out.println(sum1);//10String[] words2 {cat,bt,hat,tree};String chars2 atach;int sum2 countAllWordsLength(words2, chars2);System.out.println(sum2);//6}public static int countAllWordsLength (String[] words,String chars){int result 0;int[] charsCount count(chars);//遍历字符串数组for (int i 0; i words.length; i) {int[] wordsCount count(words[i]);//挨个判断字符串数组中的每一个字符串是否可以由给定的字符组成if (contains(wordsCount,charsCount)){//累计可以被组成的字符串的长度result words[i].length();}}return result;}/*** 判断给定的字符是否可以组成字符串* param stringCount:一个数组,存储待判断字符串的字母个数* param charCount:一个数组,存储给定字符串的字母个数* return可以组成返回true,否则返回false*/public static boolean contains(int[] stringCount,int[] charCount){for (int i 0; i 26; i) {//如果待判断的字符串中某个单词出现的次数大于//给定字符串中某个字母出现的次数,表明不能组成这个字符串if (stringCount[i] charCount[i]){return false;}}return true;}/*** 计算一个单词中26个字母出现的次数* param s传入一个单词* return一个整型数组*/public static int[] count(String s){//新建一个整型数组,用来存放每个英文字母出现的次数int[] charCountArray new int[26];//遍历字符串for (int i 0; i s.length(); i) {char c s.charAt(i);charCountArray[(int)c - a] 1;}return charCountArray;}
}