treeset的使用举例

set中的hashset和treeset,区别:

相同点:

1元素值不能重复

2.hashset和treeset都不能为null

不同点:

1.hashset是无序的,treeset是有序的

2.treeset可以按照字典顺序排列,也可以自定义排序

3.hashset的底层是hashmap,是通过hashcode值和equals来保证元素的唯一性的,而hashmap是通过compareto方法来保证的

注:对于hashset来说,只有hashcode和equal值相等,两个对象才相等,存储时,当两个对象的hashcode不同,可以直接存储,hashcode值相同时,equals为true,就认为这两个对象相等,当equals为false时,就认为这两个对象不相等,这两个对象的存储相当于桶(个人理解为十字链表)

TreeSet的用法

默认的是字典的排序方法

对于引用类型,可以有两种方法自定义排序

1.在当前类中实现comparable接口,重写compareTo方法

2.重写一个类实现comparator接口,重写compare方法

对于基本数据类型,例如int类型,需要转换成包装器类型,其余与引用类型相同

两种方法取决于构造方法的不同

这是一个基本的Demo,虽然看见的是int类型的,但是内部转换成为了Integer类型


public class Demo01 {

public static void main(String[] args) {

//Set中存放的数据必须是同一类型

Set s=new TreeSet();

s.add(1);

s.add(10);

s.add(12);

s.add(9);

s.add(5);

Iterator it=s.iterator();

while(it.hasNext())

{

System.out.println(it.next());

}

}



}

对于基本数据类型,自定义类实现comparator接口,重写compare方法

public class MySort implements Comparator {

@Override

public int compare(Object o1, Object o2) {

Integer a = (Integer) o1;

Integer b = (Integer) o2;

return -1 * (a.compareTo(b));

}



}

public class test1 {

public static void main(String[] args) {



Set<Integer> s=new TreeSet(new MySort());

s.add(2);

s.add(10);

s.add(12);

s.add(9);

s.add(15);

Iterator it=s.iterator();

while(it.hasNext())

{

System.out.println(it.next());

}

}



}

对于引用类型的,第一种方法

public class Students implements java.lang.Comparable {

private String name;

private int age;



public Students(String name, int age) {

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) {

Students stu = (Students) o;

if (this.getAge() >stu.getAge()) {

return 1;

}

if (this.getAge() == stu.getAge()) {

return 0;

}

return -1;

}



@Override

public String toString() {

return "Students{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

public class test2 {

public static void main(String[] args) {

Set s=new TreeSet();

Students s1=new Students("xiaowang",23);

Students s2=new Students("dawang",56);

Students s3=new Students("shenma",21);

s.add(s1);

s.add(s2);

s.add(s3);

Iterator it=s.iterator();

while(it.hasNext())

{

System.out.println(it.next());

}



}

}

引用类型的第二种方法

public class Students2 {

private String name;

private int age;



public Students2(String name, int age) {

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 String toString() {

return "Students{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

public class MySort2 implements Comparator {



@Override

public int compare(Object o1, Object o2) {

Students2 s1 = (Students2) o1;

Students2 s2 = (Students2) o2;

int num=s1.getAge()>s2.getAge()?1:(s1.getAge()==s2.getAge()?0:-1);

return -1*num;



}

}

public class test3 {

public static void main(String[] args) {

Set s=new TreeSet(new MySort2());

Students2 s1=new Students2("xiaowang",23);

Students2 s2=new Students2("dawang",56);

Students2 s3=new Students2("shenma",21);

s.add(s1);

s.add(s2);

s.add(s3);

Iterator it=s.iterator();

while(it.hasNext())

{

System.out.println(it.next());

}



}

}

注意compare的判断,只能用于基本数据类型的包装器类型

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值