黑马程序员 TreeSet排序的两种实现方式

本文介绍如何在Java中使用TreeSet类来创建一个具有比较功能的有序集合,并通过实现Comparable接口来定制排序行为。同时展示了如何通过自定义比较器方法进一步灵活地控制集合元素的排序。并通过实例演示了学生信息的排序与打印。
------- android培训java培训、期待与您交流! ----------


代码如下

 

import java.util.TreeSet;

import java.util.Iterator;

class TreeSetDemo {

public static void main(String[] args) 

{

Student a = new Student("lisi01",20);

Student b = new Student("lisi001",20);

Student c = new Student("lisi02",18);

Student d = new Student("lisi04",17);

Student e = new Student("lisi03",15);

 

TreeSet ts = new TreeSet();

ts.add(a);

ts.add(b);

ts.add(c);

ts.add(d);

ts.add(e);

Iterator it = ts.iterator();

while(it.hasNext())

{

Student xxx=(Student)it.next();

System.out.println(xxx.name+","+xxx.age);

 

}

}

}

class Student implements Comparable

{

public int compareTo(Object obj)

{

 

if(!(obj instanceof Student))

throw new RuntimeException("不是学生类");

Student ss = (Student)obj;System.out.println(this.name+",compareTo,"+ss.name);

if(ss.age>this.age)

return -1;

if(ss.age==this.age)

return this.name.compareTo(ss.name);//使用String自身的比较方法

return 1;

}

Student(String name,int age)

{

this.name=name;

this.age=age;

}

int age;

String name;

 

}

 

 

1.让元素自身具备比较性:

让比较对象的类实现Comparable接口,复写compareTo()方法

 

2.比较器方法,将比较器的对象作为参数传给构造函数:例如

 

TreeSet ts = new TreeSet( new MyComparator);

 

新定义一个类,实现Comparator接口,复写compare()方法。

 

当两种排序都存在时,以比较器为主。

 

 

第二种方法具体实现如下:

package note.heima;

 

import java.util.Comparator;

import java.util.TreeSet;

import java.util.Iterator;

class TreeSetDemo2 {

public static void main(String[] args) 

{

Student2 a = new Student2("lisi01",20);

Student2 b = new Student2("lisi001",20);

Student2 c = new Student2("lisi02",18);

Student2 d = new Student2("lisi04",17);

Student2 e = new Student2("lisi03",15);

Student2 f = new Student2("lisi03",15);

 

TreeSet ts = new TreeSet(new MyComp());

ts.add(a);

ts.add(b);

ts.add(c);

ts.add(d);

ts.add(e);

ts.add(f);

Iterator it = ts.iterator();

while(it.hasNext())

{

Student2 xxx=(Student2)it.next();

System.out.println(xxx.name+","+xxx.age);

 

}

}

}

class MyComp implements Comparator

{

public int compare(Object o1,Object o2)

{

Student2 s1 = (Student2)o1;

Student2 s2 = (Student2)o2;

int num = s1.name.compareTo(s2.name);

if (num>0)

 return 1;

if (num<0)

 return -1;

if (num == 0)

{

return new Integer(s1.age).compareTo(new Integer(s2.age));

}

return num;

}

}

class Student2 implements Comparable

{

public int compareTo(Object obj)

{

 

if(!(obj instanceof Student2))

throw new RuntimeException("不是学生类");

Student2 ss = (Student2)obj;System.out.println(this.name+",compareTo,"+ss.name);

if(ss.age>this.age)

return -1;

if(ss.age==this.age)

return this.name.compareTo(ss.name);//使用String自身的比较方法

return 1;

}

Student2(String name,int age)

{

this.name=name;

this.age=age;

}

int age;

String name;

 

}

 

 

 

 

### Java中TreeSet两种排序方式 #### 自然排序 自然排序是指通过让对象实现`Comparable`接口来定义其自身的比较逻辑。当一个类实现了该接口后,可以通过重写`compareTo`方法指定如何进行比较。这种方式适用于希望按照某种固定的顺序排列的对象。 以下是基于自然排序的一个示例: ```java import java.util.*; public class Person implements Comparable<Person> { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public int compareTo(Person other) { return Integer.compare(this.age, other.age); } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } public static void main(String[] args) { TreeSet<Person> treeSet = new TreeSet<>(); treeSet.add(new Person("Alice", 30)); treeSet.add(new Person("Bob", 25)); treeSet.add(new Person("Charlie", 35)); for (Person person : treeSet) { System.out.println(person); } } } ``` 在这个例子中,`Person`类实现了`Comparable`接口并重写了`compareTo`方法,使得`TreeSet`能够根据年龄字段自动排序[^1]。 --- #### 比较器排序 另一种排序方式是通过向`TreeSet`传递一个自定义的`Comparator`实例来进行排序。这种方法允许在不修改原始类的情况下灵活地调整排序规则。 下面是使用比较器排序的例子: ```java import java.util.*; public class Main { public static void main(String[] args) { Comparator<Person> comparator = (p1, p2) -> p1.getName().compareTo(p2.getName()); TreeSet<Person> treeSet = new TreeSet<>(comparator); treeSet.add(new Person("Alice", 30)); treeSet.add(new Person("Bob", 25)); treeSet.add(new Person("Charlie", 35)); for (Person person : treeSet) { System.out.println(person); } } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } ``` 在此代码片段中,我们创建了一个匿名内部类作为`Comparator`,并通过它指定了按名字升序的方式对`TreeSet`中的元素进行排序[^1]。 --- ### 总结 以上展示了Java中`TreeSet`支持的两种主要排序方式——自然排序和比较器排序。每种方式都有各自的适用场景:如果目标类型的默认排序行为固定,则可以选择自然排序;而当需要动态改变排序策略时,推荐采用比较器排序
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值