黑马程序员技术交流社区
标题:
【记录】代码练习-TreeSet集合
[打印本页]
作者:
Kevin.Kang
时间:
2015-7-15 17:48
标题:
【记录】代码练习-TreeSet集合
本帖最后由 Kevin.Kang 于 2015-7-17 14:41 编辑
package com.kxg.set;
import java.util.TreeSet;
/*
* TreeSet:能够对元素按照某种规则进行排序。
* 特点:
* 排序和唯一
* 排序的两种方式:
* 自然排序
* 实现Comparable接口中的compareTo()方法
* 比较器排序
* 实现Comparator接口中的Comparator()方法
*
*/
public class TreeSetDemo {
public static void main(String[] args) {
// Integer中已经重写了compareTo()方法,可以写成无参构造。
TreeSet<Integer> set = new TreeSet<Integer>();
set.add(25);
set.add(22);
set.add(24);
set.add(25);
set.add(29);
set.add(28);
set.add(25);
set.add(45);
set.add(32);
set.add(89);
set.add(12);
for (Integer i : set) {
System.out.println(i);
}
}
}
复制代码
作者:
Kevin.Kang
时间:
2015-7-15 18:35
本帖最后由 Kevin.Kang 于 2015-7-21 14:38 编辑
package com.kxg.set;
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetDemo2 {
public static void main(String[] args) {
TreeSet<Student> set = new TreeSet<Student>();
TreeSet<Student> set2 = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
// 主要条件:按照名字长度排序,访问不到Student类中的name和age,换用getXxx方法得到。
int num = s1.getName().length() - s2.getName().length();
// 次要条件:名字长度相同,不代表名字内容相同
// 如果名字长度相同,就比较名字内容是否相同
int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
: num;
// 名字内容相同,不代表年龄相同
// 如果名字内容相同,比较对象的年龄是否相同,如果相同就认为是同一个对象,不添加
int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
return num3;
}
});
Student s1 = new Student("kangxiaoguang", 23);
Student s2 = new Student("liyanxu", 20);
Student s3 = new Student("renxingya", 23);
Student s4 = new Student("zhaolei", 19);
Student s5 = new Student("wangao", 21);
Student s6 = new Student("kangxiaoguang", 23);
Student s7 = new Student("renxingya", 33);
Student s8 = new Student("liyanxu", 20);
Student s9 = new Student("liyanxu", 22);
set.add(s1);
set.add(s2);
set.add(s3);
set.add(s4);
set.add(s5);
set.add(s6);
set.add(s7);
set.add(s8);
set.add(s9);
set2.add(s1);
set2.add(s2);
set2.add(s3);
set2.add(s4);
set2.add(s5);
set2.add(s6);
set2.add(s7);
set2.add(s8);
set2.add(s9);
for (Student s : set) {
System.out.println(s);
}
}
}
复制代码
作者:
Kevin.Kang
时间:
2015-7-21 11:19
摘抄强哥:
a.自然顺序(Comparable)
对象实现Comparable接口
TreeSet类的add()方法中会把存入的对象提升为Comparable类型
调用对象的compareTo()方法和集合中的对象比较
根据compareTo()方法返回的结果进行存储
b.比较器顺序(Comparator)
创建TreeSet的时候可以制定 一个Comparator
如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
add()方法内部会自动调用Comparator接口中compare()方法排序
c.两种方式的区别
TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
TreeSet如果传入Comparator, 就优先按照Comparator
作者:
Kevin.Kang
时间:
2015-7-21 14:41
Stuent类:
package com.kxg.set;
public class Student implements Comparable<Student> {
private String name;
private int age;
public Student() {
super();
}
public Student(String naem, int age) {
super();
this.name = naem;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String naem) {
this.name = naem;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public String toString() {
return name + "==" + age;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public int compareTo(Student s) {
// 主要条件:按照名字长度排序
int num = this.name.length() - s.name.length();
// 次要条件:名字长度相同,不代表名字内容相同
// 如果名字长度相同,就比较名字内容是否相同
int num2 = num == 0 ? this.name.compareTo(s.name) : num;
// 名字内容相同,不代表年龄相同
// 如果名字内容相同,比较对象的年龄是否相同,如果相同就认为是同一个对象,不添加
int num3 = num2 == 0 ? this.age - s.age : num2;
return num3;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2