TreeSet,Treemap主要是排序...
TreeSet
排序方式1–自然排序
案例:
class Student implements Comparable<Student>{
String name;
int score;
public Student(String name, int score) {
super();
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [name=" + name + ", score=" + score + "]";
}
/* 仅限于姓名为英文字母
@Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
//先按分数排序
int cmp=this.score-o.score;
//如果成绩相同按照姓名排序,利用String的compareTo方法比较
int cmp2=(cmp==0)? (this.name.compareTo(o.name)) :cmp;
return cmp2;
}
*/
public int compareTo(Student o) {
// TODO Auto-generated method stub
Collator c=Collator.getInstance(Locale.CHINA);
//获取语言,实现对汉字的比较因为Collator有compare方法
//先按分数排序
int cmp=this.score-o.score;
//如果成绩相同按照姓名排序,利用String的compareTo方法比较
int cmp2=(cmp==0)? c.compare(this.name, o.name) :cmp;
return cmp2;
}
}
测试代码:
TreeSet:只要实现了Comparable接口,就可以实现自然排序
public class Set_03 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<Student> sr=new TreeSet<Student>();
sr.add(new Student("阿萨德",89));
sr.add(new Student("阿斯顿",99));
sr.add(new Student("执行",72));
sr.add(new Student("个人",65));
sr.add(new Student("你好",72));
sr.add(new Student("全",72));
sr.add(new Student("时段",88));
sr.add(new Student("不过",88));
System.out.println(sr);
System.out.println("------------------------------");
}
}
排序方式2–比较器排序
测试代码:
注意:方式1在不改动源码的基础上用实现接口类进行比较
一般用方式2:在构造方法中直接使用子类匿名对象,重写compare方法,这种做法节省空间
public class Set_04 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//方式1:
//Set<Student> sr=new TreeSet<Student>(new StudentImpl());
/* Comparator 要用其子类对象实例化,但是限制了Student只能是Student的本身或父类
构造方法源码:public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
*/
//方式2:
TreeSet<Student> sr=new TreeSet<Student>(new Comparator<Student>(){
@Override
public int compare(Student s1,Student s2) {
// TODO Auto-generated method stub
//先按分数排序
int cmp=s1.score-s2.score;
//如果成绩相同按照姓名排序,利用String的compareTo方法比较
int cmp2=(cmp==0)? (s1.name.compareTo(s2.name)) :cmp;
return cmp2;
}});
sr.add(new Student("阿萨德",89));
sr.add(new Student("阿斯顿",99));
sr.add(new Student("执行",72));
sr.add(new Student("个人",65));
sr.add(new Student("你好",72));
sr.add(new Student("全",72));
sr.add(new Student("时段",88));
sr.add(new Student("不过",88));
System.out.println(sr);
}
}
class Student{
String name;
int score;
public Student(String name, int score) {
super();
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [name=" + name + ", score=" + score + "]";
}
}
class StudentImpl implements Comparator<Student>{
@Override
public int compare(Student s1,Student s2) {
// TODO Auto-generated method stub
//先按分数排序
int cmp=s1.score-s2.score;
//如果成绩相同按照姓名排序,利用String的compareTo方法比较
int cmp2=(cmp==0)? (s1.name.compareTo(s2.name)) :cmp;
return cmp2;
}
}
TreeMap实现员工按员工的年龄、工资、姓名进行排序:
hash equals用于去重操作
hashset的本质就是hashmap
map中的putval有去重的操作
class Staffs{
String name;
Double salary;
Integer age;
public Staffs(String name, Double salary, Integer age) {
super();
this.name = name;
this.salary = salary;
this.age = age;
}
@Override
public String toString() {
return "Staff [name=" + name + ", salary=" + salary + ", age=" + age + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((salary == null) ? 0 : salary.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Staffs other = (Staffs) obj;
if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (salary == null) {
if (other.salary != null)
return false;
} else if (!salary.equals(other.salary))
return false;
return true;
}
public class Set_06 {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeMap<Staffs, String> map = new TreeMap(
new Comparator<Staffs>(){
@Override
public int compare(Staffs o1, Staffs o2) {
// TODO Auto-generated method stub
Collator c=Collator.getInstance(Locale.CHINA);//解决中文排序
int temp=o1.age-o2.age;
int temp2=(temp==0)?o1.salary.compareTo(o2.salary):temp;
int temp3=(temp2==0)?c.compare(o1.name, o2.name):temp2;
return temp3;
}
}
);
//HashMap
map.put(new Staffs("lj",5000.0,28), "lj");
map.put(new Staffs("aj2",3000.0,27), "aj2");
map.put(new Staffs("ej4",3000.0,27), "ej4");
map.put(new Staffs("yj5",5000.0,28), "yj5");
map.put(new Staffs("zj6",5000.0,28), "zj6");
map.put(new Staffs("bj3",3000.0,27), "bj3");
map.put(new Staffs("ej4",3000.0,27), "ej4");
map.put(new Staffs("yj5",5000.0,28), "yj5");
map.put(new Staffs("zj6",5000.0,28), "zj6");
for(Staffs sta:map.keySet()){
System.out.println(sta.age+" "+sta.name+" "+sta.salary);
}
}
}
TreeMap
1.底层数据结构是自平衡的二叉树
2.如何保证元素唯一?
- 根据二叉树的存的特点
第一个元素进来作为根节点存储
后面元素和根节点一次比较
大了 放在根的左边
小了 放在根的右边
相等 就不存储
3.如何保证元素无序的
- 因为可排序,所以相对于存储的时候是无序的
4.如何保证元素可排序的
- 根据二叉树 取 的特点 (中序遍历)
面试题: 已知前序遍历和中序遍历,求后序遍历的结果?
5.TreeMap的数据结构仅针对键有效,和值无关
6.如果键是系统类一般都实现了Comparable接口,如果是自定义对象,需要自己实现Comparable接口【自然排序】或者Comparator接口【比较器排序
7.TreeMap重复的key会被覆盖,如下12-》sid
因为是基本数据类型的包装类,已经实现过比较接口,所以可以直接排序
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeMap<Integer, String> tp = new TreeMap<Integer,String>();
tp.put(12, "sd");
tp.put(112, "sd");
tp.put(13, "sd");
tp.put(11, "sd");
tp.put(12, "sid");
tp.put(15, "sd");
tp.put(172, "s4d");
Set<Integer> se=tp.keySet();
for (Integer i:se) {
System.out.println(i+tp.get(i));
}
}
11sd
12sid
13sd
15sd
112sd
172s4d