java 18 - 5 TreeMap的举例
TreeMap:是基于红黑树的Map接口的实现。
TreeMap<String/Integer,String>:迭代顺序会按照自然顺序
TreeMap<Person,String>:迭代顺序要自己定义
键:Person
值:String
package map_son; 2 3 import java.util.Comparator; 4 import java.util.Set; 5 import java.util.TreeMap; 6 7 public class TreeMapDemo { 8 9 public static void main(String[] args) { 10 // 创建集合对象 11 // 注意,这里要用的是自定义迭代,而且使用匿名内部类 12 TreeMap<Person, String> t1 = new TreeMap<Person, String>( 13 new Comparator<Person>() { 14 // 按照年龄大小排列 15 //Cannot reduce the visibility of the inherited method from Comparator<Person> 16 //出现这个错误的时候,应该把系统自己生成的下面的private改为public 17 public int compare(Person p1, Person p2) { 18 int num1 = p1.getAge() - p2.getAge(); 19 // 若年龄一样,则看名字是否一样 20 int num2 = num1 == 0 ? p1.getName().compareTo( 21 p2.getName()) : num1; 22 return num2; 23 24 } 25 }); 26 27 // 创建Person对象 28 Person p1 = new Person("潘安", 30); 29 Person p2 = new Person("柳下惠", 35); 30 Person p3 = new Person("唐伯虎", 33); 31 Person p4 = new Person("燕青", 32); 32 Person p5 = new Person("唐伯虎", 33); 33 34 // 添加到集合中 朝代乱写的 35 t1.put(p1, "宋朝"); 36 t1.put(p2, "元朝"); 37 t1.put(p3, "明朝"); 38 t1.put(p4, "清朝"); 39 t1.put(p5, "民国"); 40 t1.put(p1, "唐朝");// 两个的键都是p1 41 42 // 进行遍历 43 // 创建键集合 44 Set<Person> sp = t1.keySet(); 45 // 遍历键集合 46 for (Person key : sp) { 47 // 获取对应的值 48 String value = t1.get(key); 49 // 输出 50 System.out.println(key.getName() + "\t" + key.getAge() + "\t" 51 + value); 52 } 53 /* 宋朝的被唐朝的所替换掉。键一样,后来的替换前面的,Map的特性之一 54 潘安 30 唐朝 55 燕青 32 清朝 56 唐伯虎 33 民国 57 柳下惠 35 元朝 58 */ 59 60 } 61 }
需求:
"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)
分析:
A:定义一个字符串对象(键盘录入元素)
B:定义一个集合:
键:Character
值:Integer
C:把字符串转换为字符数组
D: 遍历字符串数组,把里面的元素作为键放入集合中:
但是,条件是这些:(把键作为元素放进去,如果该键已经存在,则返回null,否则不是null)
a:返回的是null:则把该元素作为键添加进去,同时对应的值为1
b:返回的不是null:则把该元素对应的值+1,重新加载键和值
E:定义一个字符串缓冲区
F:遍历集合,把集合中的键和值按照想要的格式进行拼接,拼接到字符串缓冲区中
G:转换为String类,并输出
1 package map_son; 2 3 import java.util.Scanner; 4 import java.util.Set; 5 import java.util.TreeMap; 6 7 public class TreeMapDemo2 { 8 9 public static void main(String[] args) { 10 // 定义键盘录入 11 Scanner sc = new Scanner(System.in); 12 System.out.println("请输入一段字符串:"); 13 String line = sc.nextLine(); 14 15 // 定义一个集合:键:Character 值:Integer 16 TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>(); 17 18 // 把字符串转为字符数组 19 char[] c = line.toCharArray(); 20 21 // 遍历字符串数组,把里面的元素作为键放入集合中: 22 // 这一段代码中,运用了几次Integer和Character的自动拆箱和自动装箱 23 for (char ch : c) { 24 // 首先得定义一个值,看返回值 25 Integer result = tm.get(ch); 26 27 // a:返回的是null:则把该元素作为键添加进去,同时对应的值为1 28 if (result == null) { 29 tm.put(ch, 1); 30 } else { 31 result++; 32 tm.put(ch, result); 33 } 34 35 } 36 37 // 定义一个字符串缓冲区 38 StringBuilder sb = new StringBuilder(); 39 40 // 遍历集合,把集合中的键和值按照想要的格式进行拼接,拼接到字符串缓冲区中 41 // 获取键的集合 42 Set<Character> s = tm.keySet(); 43 for (Character key : s) { 44 45 // 获取对应的值 46 Integer i = tm.get(key); 47 48 // 把集合中的键和值按照想要的格式进行拼接,拼接到字符串缓冲区中 a(5)b(4)c(3)d(2)e(1) 49 sb.append(key).append("(").append(i).append(")"); 50 } 51 52 // 字符串缓冲区转换为String类,并输出 53 String count = sb.toString(); 54 System.out.println("统计结果是:" + count); 55 } 56 57 }
1 package map_son; 2 /* 3 Person自定义类 4 */ 5 public class Person { 6 7 private String name; 8 private int age; 9 10 11 public Person() { 12 super(); 13 // TODO Auto-generated constructor stub 14 } 15 16 17 public Person(String name, int age) { 18 super(); 19 this.name = name; 20 this.age = age; 21 } 22 23 24 public String getName() { 25 return name; 26 } 27 28 29 public void setName(String name) { 30 this.name = name; 31 } 32 33 34 public int getAge() { 35 return age; 36 } 37 38 39 public void setAge(int age) { 40 this.age = age; 41 } 42 }
何事都只需坚持..
难?
维熟尔。
LZL的自学历程...只需坚持