-------android培训、java培训、期待与您交流! ----------
//方法一:
package com.itheima;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo {
/**
* Set集合是元素不重复的无序集合
* 子类TreeSet,为了判断元素的唯一性,是根据比较方法的返回结果是否是0,如果是0视为相同元素不存,不为0则存储
* TreeSet具有排序功能,故再选择集合时元素唯一且需要进行排序要使用TreeSet集合
* TreeSet集合第一种排序:将元素对象赋于比较功能,对象实现Comparable接口,覆盖CompareTo方法,根据CompareTo方法返回的值对元素进行排序
*
* @param args
*/
public static void main(String[] args) {
TreeSet ts = new TreeSet();
ts.add(new Person("wangcat",30));
ts.add(new Person("xiaoqiang",21));
ts.add(new Person("lisi",25));
ts.add(new Person("aisin",25));
ts.add(new Person("jialiu",23));
ts.add(new Person("zhijin",32));
Iterator it = ts.iterator();
while(it.hasNext()){
Person p = (Person)it.next();
System.out.println(p.getName()+":"+p.getAge());
}
}
}
class Person implements Comparable{
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
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 int compareTo(Object o) {
Person p = (Person)o; //强制转换
int temp = this.age-p.age; //字符串对象就实现了Comparable接口,故可以使用compareTo进行自然排序
return temp==0?this.name.compareTo(p.name):temp;
}
}
//方法二:
package com.itheima;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo2 {
/**
* TreeSet第二种排序:将集合赋于排序功能,创建比较器,实现Comparator接口,覆盖compare方法,将此比较器作为参数传递给
* 集合的构造函数
* 何时使用比较器?如果不按照对象中具备的自然排序进行排序,或对象不具备自然排序,就用比较器方式进行排序的实现
* @param args
*/
public static void main(String[] args) {
TreeSet ts = new TreeSet(new ComparatorByAge()); //将比较器传递给集合
ts.add(new Person2("wangcat",30));
ts.add(new Person2("xiaoqiang",21));
ts.add(new Person2("lisi",25));
ts.add(new Person2("aisin",25));
ts.add(new Person2("jialiu",23));
ts.add(new Person2("zhijin",32));
Iterator it = ts.iterator();
while(it.hasNext()){
Person2 p = (Person2)it.next();
System.out.println(p.getName()+":"+p.getAge());
}
}
}
class Person2{
private String name;
private int age;
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;
}
public Person2(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
class ComparatorByAge implements Comparator{ //实现接口
@Override
public int compare(Object o1, Object o2) { //覆写方法
Person2 p1 = (Person2)o1;
Person2 p2 = (Person2)o2;
int temp = p1.getAge()-p2.getAge();
return temp==0?p1.getName().compareTo(p2.getName()):temp;
}
}
//思考1,要想按照先进先出或先进后出的方式取出TreeSet集合中的元素,可以定义比较器返回值,依据的是二叉树思想,代码如下:
class ComparatorByIn implements Comparator{ //实现接口
@Override
public int compare(Object o1, Object o2) { //覆写方法
return 1;
}
}
//这里如果返回的是1是按照后进来的比前面的大,在二叉树中排序位置,取出时按照从上到下的顺序取出元素,实现了先进先出。如果返回的是-1则是先进后出的顺序,如果是0则不会存储后面的任何元素
//练习1,按照字符串长度进行排序
//注:由于字符串String存在CompareTo(),有自身的排序功能,所以不能在元素上定义排序,只能在比较器中定义排序,代码如下:
class ComparatorByLength implements Comparator{
public int compare(Object o1, Object o2){
String s1 = (String)o1;
String s2 = (String)o2;
int temp = s1.length() - s2.length();
return temp == 0?s1.compareTo(s2):temp;
}
}