TreeSet要求加入的所有元素都可以相互比较大小;可以控制比较位置来决定排序方向;hashset只能比较可相等不能比较大小

来源:互联网 发布:淘宝翡翠手镯 编辑:程序博客网 时间:2024/06/08 04:16

TreeSet要求加入的所有元素都可以相互比较大小。它通过比较过程中返回0来判定出重复的元素。

元素间比较大小有两种处理方案:(1)可以通过元素本身的类实现Comparable来自我解决。 (2)可以通过引用外部的专门的“裁判类”来裁决两个元素的大小关系。

import java.util.Comparator;

import java.util.Set;

import java.util.TreeSet;


/*class Person implements Comparable{
private int age;
private String name;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public int compareTo(Object o) {
// 若不是person类型,或者相等都让返回0(发生碰撞),相等的情况就不添加
if ((o instanceof Person)==true) {
Person p=(Person)o;
int t=this.name.compareTo(p.name);
if(t!=0)return t;
return this.age-p.age;
}
return 0;
}
public String toString() {
return name+" is "+age;
}
}*/
class Person {
private int age;
public int getAge() {
return age;
}


public void setAge(int age) {
this.age = age;
}


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


private String name;
public Person(String name,int age){
this.name=name;
this.age=age;
}


public String toString() {
return name+" is "+age;
}
}
/**
 * 裁判类又称比较器
 * @author lenovo
 *
 */
class K implements Comparator{


public int compare(Object o1, Object o2) {
// 若不是person类型,或者相等都让返回0,相等的情况就不添加
if ((o1 instanceof Person)==true&&(o2 instanceof Person)==true) {
Person p1=(Person)o1;
Person p2=(Person)o2;
int t=p2.getName().compareTo(p1.getName());
if (t!=0) {
return t;
}

return p2.getAge()-p1.getAge();

}
return 0;
}

}
/**
 * 除了string,必须对一般类实现比较接口或者用外部裁判类
 * @author lenovo
 *
 */
public class TreeSetTest {

public static void main(String[] args) {
//string的内容放在字符串区,String本身就实现了comparable,直接比较内容
/*Set<String> a=new TreeSet<String>();
a.add("abc");
a.add("xyz");
a.add("abc");
System.out.println(a);*/

//第一种实现comparable接口
/*Set<Person> b=new TreeSet<Person>();
b.add(new Person("kane",10));
b.add(new Person("kane",11));//若未实现comparable,添加第二个时就会报错
b.add(new Person("kane",10));
b.add(new Person("li",10));
b.add(new Person("hao",11));
b.add(new Person("hao",12));
b.add(new Person("hao",13));

//先名称再年龄都是排序输出,因为是通过比较实现的
System.out.println(b);*/

//第二种非侵入方式
Set<Person> b=new TreeSet<Person>(new K());//应用外部裁判类,否则添加第二个时就会报错
b.add(new Person("kane",10));
b.add(new Person("kane",11));
b.add(new Person("kane",10));
b.add(new Person("li",10));
b.add(new Person("hao",11));
b.add(new Person("hao",12));
b.add(new Person("hao",13));
//先名称再年龄都是排序输出,因为是通过比较实现的,和上面的顺序不同,因为前后位置调了下
System.out.println(b);
}
}

19 0