【java】TreeSet、Comparable、Comparator、内部类、匿名类
package com.tn.treeSet;
public class Student {
private String name;
private int age;
public Student(){}
public Student(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 String toString() {
return "Student [name=" + name + "]";
}
}
Student
package com.tn.treeSet;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args){
TreeSet<Student> students=new TreeSet<>();//后一个尖括号内可以省略类型
Student student1=new Student("武松",30);
Student student2=new Student("林冲",31);
Student student3=new Student("鲁智深",29);
students.add(student1);
students.add(student2);
students.add(student3);
System.out.println(students);
}
}
TreeSetDemo
运行结果:

原因:TreeSet中加入的对象需要能进行比较,即实现Comparable接口
改造一:在Student类中实现Comparable接口
package com.tn.treeSet;
public class Student implements Comparable<Student> {
private String name;
private int age;
public Student(){}
public Student(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 String toString() {
return "Student [name=" + name + "]";
}
@Override
public int compareTo(Student o) {
if(!this.equals(o)){
// return this.name.compareTo(o.name);
return o.name.compareTo(this.name);//和上面语句打印顺序颠倒。
}
return 0;
}
}
Student
package com.tn.treeSet;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args){
TreeSet<Student> students=new TreeSet<>();//后一个尖括号内可以省略类型
Student student1=new Student("武松",30);
Student student2=new Student("林冲",31);
Student student3=new Student("鲁智深",29);
students.add(student1);
students.add(student2);
students.add(student3);
System.out.println(students);
};//方法体结结尾大括号后有;不会报错
};//类体最后一个大括号后有;不会报错
TreeSetDemo
改造二:用内部类实现Comparator接口
package com.tn.treeSet;
public class Student{
private String name;
private int age;
public Student(){}
public Student(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 String toString() {
return "Student [name=" + name + "]";
}
}
Student
package com.tn.treeSet; import java.util.Comparator;
import java.util.TreeSet; public class TreeSetDemo {
public static void main(String[] args){
Student student1=new Student("武松",30);
Student student2=new Student("林冲",31);
Student student3=new Student("鲁智深",29);
//TreeSet构造时用Comparator作为构造函数参数
TreeSet<Student> students=new TreeSet<Student>(new ComparatorDemo());
students.add(student1);
students.add(student2);
students.add(student3);
System.out.println(students);
}
static class ComparatorDemo implements Comparator<Student>{
// 内部类要写在类体里,但不能写进类中方法体内。
@Override
public int compare(Student o1, Student o2) {
return o1.getName().compareTo(o2.getName());
}
}
}
TreeSetDemo
改造三:用匿名类实现Comparator接口
package com.tn.treeSet;
public class Student{
private String name;
private int age;
public Student(){}
public Student(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 String toString() {
return "Student [name=" + name + "]";
}
}
Student
package com.tn.treeSet; import java.util.Comparator;
import java.util.TreeSet; public class TreeSetDemo {
public static void main(String[] args) {
Student student1 = new Student("武松", 30);
Student student2 = new Student("林冲", 31);
Student student3 = new Student("鲁智深", 29); TreeSet<Student> students = new TreeSet<Student>(
new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getName().compareTo(o2.getName());
}
});
students.add(student1);
students.add(student2);
students.add(student3);
System.out.println(students);
}
}
TreeSetDemo
总结:
TreeSet容器中的对象要能排序,两种实现排序方法:
1.TreeSet使用无参构造函数,容器中的对象实现Comparable接口,见改造一;
2.TreeSet构造时使用Comparator作为构造函数参数;
比较方法如果返回0,则对象不能重复加入。
TreeSet底层是TreeMap
【java】TreeSet、Comparable、Comparator、内部类、匿名类的更多相关文章
- Java入门教程十(抽象类接口内部类匿名类)
抽象类(abstract) 一个类只定义了一个为所有子类共享的一般形式,至于细节则交给每一个子类去实现,这种类没有任何具体的实例,只具有一些抽象的概念,那么这样的类称为抽象类. 在面向对象领域,抽象类 ...
- java容器---Comparable & Comparator
1.接口Comparable<T> API 参数类型:T ---可以与此对象进行比较的那些对象的类型 此接口强行对实现它的每个类的对象进行整体排序.这种排序被称为类的自然排序,类的c ...
- Java TreeSet集合排序 && 定义一个类实现Comparator接口,覆盖compare方法 && 按照字符串长度排序
package TreeSetTest; import java.util.Iterator; import java.util.TreeSet; import javax.management.Ru ...
- Java:匿名类,匿名内部类
本文内容: 内部类 匿名类 首发日期 :2018-03-25 内部类: 在一个类中定义另一个类,这样定义的类称为内部类.[包含内部类的类可以称为内部类的外部类] 如果想要通过一个类来使用另一个类,可以 ...
- Java之匿名类讲解
参考https://blog.csdn.net/jiaotuwoaini/article/details/51542059 匿名类,正如名字一样在java中没有名字标识的类,当然了编译后还是会安排一个 ...
- Java 中的 匿名类
什么是内部类? 在一个类中定义另一个类,这样定义的类称为内部类.包含内部类的类称为内部类的外部类. 如果想要通过一个类来使用另一个类,可以定义为内部类. 内部类的外部类的成员变量在内部类仍然有效,内部 ...
- java内部类以及匿名类
内部类 一个类内部定义的类称为内部类. 内部类允许把逻辑相关的类组织在一起,并控制内部代码的可视性. 内部类与外部类的结构层次如下. 顶层类:最外层的类 外部类:内部类所在的类 内部类:类内部定义的类 ...
- (转)Java基础——嵌套类、内部类、匿名类
本文内容分转自博客:http://www.cnblogs.com/mengdd/archive/2013/02/08/2909307.html 将相关的类组织在一起,从而降低了命名空间的混乱. 一个内 ...
- Java中的内部类、匿名类的使用
代码(test.java): interface ie{ public void print(); } class outer{} public class test{ public class in ...
随机推荐
- maven学习之三
maven 创建工程: 1:直接命令:mvn archetype:generate -X -DgroupId=org.sselab -DartifactId=maven-for-mongodb -D ...
- HTML5技术分享 ES2017继发与并发
大家都知道,async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了.你可以用then方法指定下一步的操作. 进一步说,async函数完 ...
- python 常用库整理
python 常用库整理 GUI 图形界面 Tkinter: Tkinter wxPython:wxPython pyGTK:PyGTK pyQt:pyQt WEB框架 django:django w ...
- 社群公会GangSDK:程序员入行AI领域需要哪些技能?
作为一名Android开发工程师,身边总有些同行很焦虑,看着人工智能越来越火,总是担心Android要不行了,所以,我们需要转行么?Android还能走多久?其实,无论是对于Android还是iOS开 ...
- Ajax-javascript
一.Web 2.0的特点 提到Ajax不得不提到WEB2.0 1.用户贡献内容 2.内容聚合RSS 3.更丰富的"用户体验" 二.Ajax的作用 无刷新:不刷新整个页面,只刷新局部 ...
- 数据结构 集合_集合(数学)抽象数据类型的C语言实现
链表是实现集合的一种理想的方式.将List以typedef的方式重命名为Set.这样做能保留链表简洁的特性,还能使集合具有了一些多态的特性. 使用这种方法的最大好处就是可以使用list_next来遍历 ...
- Foundation框架的小总结
一.Foundation框架—结构体 一.基本知识 Foundation框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础. 如果要想使用foundation框架中的数 ...
- P1629 邮递员送信
题目描述: 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要一定的时间.这个邮递员 ...
- Servlet与Jsp的结合使用实现信息管理系统二
PS:前面说了抽取框架的搭建,接着就要我们开始进入网址的时候就要查到全部信息并显示在首页,我们用到的MySql数据库,具体步骤是: 创建数据库,创建表,添加信息 项目中调入mysql的jar包 mys ...
- Spring Cloud Zuul
新建Spring Boot工程,命名为zuul 1.pom.xml添加依赖 <?xml version="1.0" encoding="UTF-8"?&g ...