目录
1:<String,String>
2:<Student,String>
一:TreeMap类概述
键是红黑树结构,可以保证键的排序和唯一性
继承于map重写了它的方法。
二:解释
由于TreeMap底层与TreeSet一样,所以如果它的key为对象时对象应该实现Comparable接口并且指定泛型,或者用比较器排序用匿名内部类形式实现Comparator接口
否则会出错
Student cannot be cast to java.lang.Comparable
三:例子
1:<String,String>
package protice5;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class Test7 {
public static void main(String[] args) {
//创建 TreeMap对象指定key和value值指定为字符串
TreeMap<String, String> s = new TreeMap<String, String>();
//向TreeMap添加元素
s.put("002", "hello");
s.put("001", "java");
s.put("005", "world");
s.put("008", "haddop");
//遍历获得key和value并输出
Set<Map.Entry<String, String>> entries = s.entrySet();
for (Map.Entry<String, String> entry : entries) {
System.out.println(entry.getKey()+"**"+entry.getValue());
}
}
}
2:<Student,String>
package protice5;
import java.util.Objects;
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
package protice5;
import java.util.Comparator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class Test8 {
public static void main(String[] args) {
//创建TreeMap对象指定key为Student,value为String,用比较器排序(采用匿名内部类形式)
TreeMap<Student, String> s = new TreeMap<Student, String>(new Comparator<Student>() {
//判断年龄是否相等如果相等判断姓名,最后按照年龄从小到大排序
@Override
public int compare(Student o1, Student o2) {
int i = o1.getAge()-o2.getAge();
int i1 = i == 0? o1.getName().compareTo(o2.getName()):i ;
return i1;
}
});
//创建学生对象
Student s1 = new Student("小华", 14);
Student s2 = new Student("小利", 19);
Student s3 = new Student("小白", 12);
Student s4 = new Student("小笠", 14);
Student s5 = new Student("小于", 18);
//向TreeMap中添加元素
s.put(s1, "001");
s.put(s2, "002");
s.put(s3, "003");
s.put(s4, "004");
s.put(s5, "005");
//遍历获取键值并输出
Set<Map.Entry<Student, String>> entries = s.entrySet();
for (Map.Entry<Student, String> entry : entries) {
System.out.println(entry.getKey()+"**"+entry.getValue());
}
}
}
3:判断输入字符串中字符出现的次数
键盘录入字符串。 获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1) 分析: 1、键盘录入一个字符串 2、创建一个集合对象TreeMap key: Character value: Integer 3、将字符串转成字符串数组 4、遍历字符数组获取到每一个字符 5、拿到字符去集合的键找,看看有没有这个键 如果没有对应的键,就把这个字符当作key,value值为1进行存储 如果有对应的键,把value值+1,重新存储到集合中 6、定义一个StringBuffer作为拼接 7、遍历集合,得到键和值,按照指定的输出个进行拼接a(5)b(4)c(3)d(2)e(1) 8、把StringBuilder转成字符串输出
package protice5;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.Scanner;
public class Test9 {
public static void main(String[] args) {
//创建TreeMap对象指定泛型
TreeMap<Character, Integer> c = new TreeMap<Character, Integer>();
//创建Scanner对象并且输入字符串
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String s= scanner.next();
//将字符串转成字符数组
char[] chars = s.toCharArray();
//遍历字符数组,利用get方法判断Map中是否有a字符如果没有就直接是1,有就加1
for (char a : chars) {
Integer integer = c.get(a);
if(integer==null){
c.put(a, 1);
}
else{ integer++;
c.put(a, integer);}
}
//创建S婷Buffer对象
StringBuffer stringBuffer = new StringBuffer();
//遍历Map得到键值
Set<Map.Entry<Character, Integer>> entries = c.entrySet();
for (Map.Entry<Character, Integer> entry : entries) {
Character key = entry.getKey();
Integer value = entry.getValue();
//将键值分别加入StringBuffer中
stringBuffer.append(key).append("(").append(value).append(")");
}
//将StringBuffer转化为String
String s1 = stringBuffer.toString();
System.out.println("结果为:"+s1);
}
}