【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 ...
随机推荐
- select * from 的一些心得
如何简单运用好 select * from语句,在不同的函数下,有不同的先后顺序. 语法格式 (代表先后顺便) (2)select 字段名 查询什么东西 (1)from 表名,从哪个表查询 例如:查询 ...
- 激光相机数据融合(5)--Gazebo仿真数据融合
这一节将用ROS+Gazebo 环境获取激光获取点云,并用PCL和OPENCV处理,源代码在:https://github.com/ZouCheng321/5_laser_camera_sim 由于激 ...
- Makefile Android.mk 引发的思索
在我们编写 Android 平台 cocos2d-x 游戏的时候,我们除了编写 Classes 之内的源代码文件之外,我们还需要维护其编译文件 Android.mk,如我们在 Classes 添加新的 ...
- 利用反射机制设计Dao
本文主要介绍如何通过Java反射机制设计通用Dao,针对中间使用到的方法进行介绍,不对反射做全面的介绍. 测试方法大家可以直接拷贝去试一下,特地写成比较通用的,注意参数就好了,当然最后还是会附上完整的 ...
- Bone Collector-HDU
Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like ...
- redis 梳理笔记(二)
一.redis 分布式 redis+keepalived (虚ip漂移) redis 100秒平均写入并发 3.6w (写入与keepalived监控程序无关) .redis 数据库内存已占有80% ...
- ios多线程开发总结
1>无论使用哪种方法进行多线程开发,每个线程启动后并不一定立即执行相应的操作,具体什么时候由系统调度(CPU空闲时就会执行). 2>更新UI应该在主线程(UI线程)中进行,并且推荐使用同步 ...
- python随机图片验证码的生成
Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 from PIL import Im ...
- heartbeat+DRBD 高可用 双机热备
heartbeat+DRBD 高可用 双机热备 原创博文http://www.cnblogs.com/elvi/p/7658109.html ## heartbeat+DRBD 高可用 双机热备 # ...
- .net程序员做的第一个安卓APP
我从毕业之后一直做的是ASP.NET,从毕业到现在都已经五六个年头了.一个事物接触久了就会慢慢没有了新鲜感热情也褪去的差不多了,我又是对新事物比较感兴趣的,虽说Android早就不算什么新事物,当对于 ...