目录
Map之HashMap
HashMap存储自定义类型
//编写一个自定义类Dog类 public class Dog { private String color; private int age; public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Dog(String color, int age) { this.color = color; this.age = age; } public Dog() { } //equals和hashCode方法的重写 @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Dog)) return false; Dog dog = (Dog) o; return age == dog.age && color.equals(dog.color); } @Override public int hashCode() { return Objects.hash(color, age); } @Override public String toString() { return "Dog{" + "color='" + color + '\'' + ", age=" + age + '}'; } } //测试类 /** * 我的目标是要来用HashMap存储自定义类型(用自定义类型来当key) */ public class Test1 { public static void main(String[] args) { LinkedHashMap<Object, Object> map = new LinkedHashMap<>(); Dog dog1 = new Dog("黑毛",2); Dog dog2 = new Dog("白毛",1); Dog dog3 = new Dog("黄毛",3); map.put(dog1,"上海"); map.put(dog2,"上dsf"); map.put(dog3,"上sdfsdf"); // 验证所有的狗对象作为key已经存入了map集合中 // 首先获取所有的key Set<Object> keys = map.keySet(); for (Object key : keys) { Object value = map.get(key); System.out.println(key+"-----------"+value); /*Dog{color='黑毛', age=2}-----------上海 Dog{color='白毛', age=1}-----------上dsf Dog{color='黄毛', age=3}-----------上sdfsdf*/ } } }
当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法(如果忘记,请回顾HashSet存放自定义对象)。
如果要保证map中存放的key和取出的顺序一致,可以使用
java.util.LinkedHashMap
集合来存放。
TreeMap
概念:
Java TreeMap类是基于红黑树的实现。它提供了一种有效的方法来按排序顺序存储键值对。
排序方式有两种:自然排序和比较器排序;到时使用的是哪种排序,取决于我们在创建对象的时候所使用的构造方法;
public TreeMap() 使用自然排序 public TreeMap(Comparator<? super K> comparator) 比较器排序自然排序很简单,就只要在新建对象是使用new TreeMap<>();不带参数就行,就可以进行自然排序
代码演示:
//比较器排序 public class Test2 { public static void main(String[] args) { TreeMap<Dog, String> treeMap = new TreeMap<>(new Comparator<Dog>() {//只要在括号里写new Comparator就会自动生成重写方法 @Override public int compare(Dog o1, Dog o2) { return o2.getAge()-o1.getAge();//重写年龄的排序 降序 } }); treeMap.put(new Dog("黄",2),"dfsdf"); treeMap.put(new Dog("白",3),"erw"); treeMap.put(new Dog("黑",1),"cvbcb"); System.out.println(treeMap);//{Dog{color='白', age=3}=erw, Dog{color='黄', age=2}=dfsdf, Dog{color='黑', age=1}=cvbcb} } }
Map集合练习
计算一个字符串中每个字符出现次数。
这个题最重要的就是
方法介绍
public boolean containKey(Object key)
:判断该集合中是否有此键。代码演示:
/** * 计算一个字符串中每个字符出现次数。 */ public class Test3 { public static void main(String[] args) { String s = "sdlkfjjwefksddvmsdf"; //用一个map集合把该字符串的字符和次数存起来,键放字符,值放次数 HashMap<Character, Integer> map = new HashMap<>(); //获取每个字节 for (int i = 0; i <s.length() ; i++) { char c = s.charAt(i); // 判断该字符是否在map集合中存在,如果存在则次数+1,否则把次数设置为1 if(map.containsKey(c)){//判断该集合中是否有此键。 Integer integer = map.get(c);//得到原来的次数 integer++;//原来的次数加1 map.put(c,integer);//更新 }else{//如果该字符没有出现过,就直接设置为1 map.put(c,1); } } System.out.println(map);//{s=3, d=4, e=1, f=3, v=1, w=1, j=2, k=2, l=1, m=1} } } 模拟斗地主洗牌发牌(讨厌这个题好复杂)
代码演示:
/** * 斗地主 */ public class Test4 { public static void main(String[] args) { // 把数字与牌对应起来 HashMap<Integer, String> map = new HashMap<>(); // 把数字放进list集合中存储 ArrayList<Integer> list = new ArrayList<>(); // map.put(1,"黑桃A"); // map.put(2,"红桃A"); // 构建纸牌;由数字+花色组成 String s = "2-A-K-Q-J-10-9-8-7-6-5-4-3"; String nums[] =s.split("-"); String oldcolor = "♥-♠-♦-♣"; String[] colors = oldcolor.split("-"); int flag = 2; for (String num : nums) { for (String color : colors) { String pooker = color+num; map.put(flag,pooker); list.add(flag); flag++; } } //将大王小王添加到集合 map.put(0, "大王"); map.put(1, "小王"); list.add(0); list.add(1); // 定义玩家 ArrayList<Integer> player1 = new ArrayList<Integer>(); ArrayList<Integer> player2 = new ArrayList<Integer>(); ArrayList<Integer> player3 = new ArrayList<Integer>(); ArrayList<Integer> diPai = new ArrayList<Integer>(); // 洗牌 Collections.shuffle(list); // 发牌 //遍历牌号的集合 判断索引发牌号 for(int i = 0 ;i < list.size() ;i++) { Integer pookerNum = list.get(i); if (i >= 51) { diPai.add(pookerNum); } else if (i % 3 == 0) { player1.add(pookerNum); } else if (i % 3 == 1) { player2.add(pookerNum); } else if (i % 3 == 2) { player3.add(pookerNum); } } // 理牌 Collections.sort(player1); Collections.sort(player2); Collections.sort(player3); // 看牌 show("罗璇",player1,map); show("万人迷",player2,map); show("陈总",player3,map); // 显示底牌 for (Integer integer : diPai) { String value = map.get(integer); System.out.println("底牌是:"+value); } } //定义方法 看牌 public static void show(String name,ArrayList<Integer> player,HashMap<Integer, String> pookerMap ){ System.out.print(name+":"); for(Integer pookerNum : player){ String thisPooker = pookerMap.get(pookerNum); System.out.print(thisPooker+" "); } System.out.println();//罗璇:大王 ♥2 ♠2 ♦2 ♣2 ♥K ♦Q ♠J ♠10 ♦9 ♥8 ♣7 ♠6 ♦6 ♣5 ♠4 ♦4 //万人迷:♦A ♥Q ♣Q ♥J ♣J ♥10 ♦10 ♠9 ♣8 ♥7 ♠7 ♥6 ♣6 ♥4 ♣4 ♠3 ♦3 //陈总:小王 ♥A ♠A ♣A ♠K ♦K ♠Q ♦J ♣10 ♥9 ♣9 ♠8 ♦8 ♦7 ♠5 ♥3 ♣3 //底牌是:♣K //底牌是:♥5 //底牌是:♦5 } }