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、内部类、匿名类的更多相关文章

  1. Java入门教程十(抽象类接口内部类匿名类)

    抽象类(abstract) 一个类只定义了一个为所有子类共享的一般形式,至于细节则交给每一个子类去实现,这种类没有任何具体的实例,只具有一些抽象的概念,那么这样的类称为抽象类. 在面向对象领域,抽象类 ...

  2. java容器---Comparable & Comparator

    1.接口Comparable<T> API    参数类型:T ---可以与此对象进行比较的那些对象的类型 此接口强行对实现它的每个类的对象进行整体排序.这种排序被称为类的自然排序,类的c ...

  3. Java TreeSet集合排序 && 定义一个类实现Comparator接口,覆盖compare方法 && 按照字符串长度排序

    package TreeSetTest; import java.util.Iterator; import java.util.TreeSet; import javax.management.Ru ...

  4. Java:匿名类,匿名内部类

    本文内容: 内部类 匿名类 首发日期 :2018-03-25 内部类: 在一个类中定义另一个类,这样定义的类称为内部类.[包含内部类的类可以称为内部类的外部类] 如果想要通过一个类来使用另一个类,可以 ...

  5. Java之匿名类讲解

    参考https://blog.csdn.net/jiaotuwoaini/article/details/51542059 匿名类,正如名字一样在java中没有名字标识的类,当然了编译后还是会安排一个 ...

  6. Java 中的 匿名类

    什么是内部类? 在一个类中定义另一个类,这样定义的类称为内部类.包含内部类的类称为内部类的外部类. 如果想要通过一个类来使用另一个类,可以定义为内部类. 内部类的外部类的成员变量在内部类仍然有效,内部 ...

  7. java内部类以及匿名类

    内部类 一个类内部定义的类称为内部类. 内部类允许把逻辑相关的类组织在一起,并控制内部代码的可视性. 内部类与外部类的结构层次如下. 顶层类:最外层的类 外部类:内部类所在的类 内部类:类内部定义的类 ...

  8. (转)Java基础——嵌套类、内部类、匿名类

    本文内容分转自博客:http://www.cnblogs.com/mengdd/archive/2013/02/08/2909307.html 将相关的类组织在一起,从而降低了命名空间的混乱. 一个内 ...

  9. Java中的内部类、匿名类的使用

    代码(test.java): interface ie{ public void print(); } class outer{} public class test{ public class in ...

随机推荐

  1. C#值参数和引用参数

    一.值参数 未用ref或out修饰符声明的参数为值参数. 使用值参数,通过将实参的值复制到形参的方式,把数据传递到方法.方法被调用时,系统做如下操作. 在栈中为形参分配空间. 复制实参到形参. 值参数 ...

  2. java 之 代理模式(大话设计模式)

    java代理模式顾名思义,就类似于大学,我想和冰可乐,可是我又在玩游戏,于是我让我的室友帮我把可乐带回来,简单的来说我的室友就是代理,而买可乐就是需要做的行为.这是笔者理解的代理模式 大话设计模式-类 ...

  3. Chapter 8: Exceptional Control Flow

    概述: 我们可以用一种“流”的概念来理解处理器的工作流程,PC(Program Counter)依次为a0,a1,a2,...,an-1,这个序列可以称作control flow.当然我们并不总是按顺 ...

  4. MSSQL-并发控制-2-Isolation

              如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各位支持!   MySQL通过MVCC和锁来实现并发控制,在4 ...

  5. CCF认证考试——折点计数

    描述:简单题 #include<iostream> using namespace std; int main() { ], n, count = ; cin >> n; ; ...

  6. 契约测试框架-Pact实践

    在前一篇博客中我们讲到契约测试是什么,以及它能给我们软件交付带来什么价值,本次将介绍一个开源的契约测试框架Pact,它最初是用ruby语言实现的,后来被js,C#,java,go,python 等语言 ...

  7. CentOS7 64位 安装MySQL5.7

    安装环境:CentOS7 64位 MINI版,安装MySQL5.7 1.配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo ...

  8. 对NumPy中dot()函数的理解

    今天学习到numpy基本的运算方法,遇到了一个让我比较难理解的问题.就是dot函数是如何对矩阵进行运算的. 一.dot()的使用 参考文档:https://docs.scipy.org/doc/num ...

  9. HDU 1060 Leftmost Digit 基础数论

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1060   这道题运用的是数学方法. 假设S=n^n.两边同时取对数,得到lgS=nlgn.即有S=10 ...

  10. python源文件转换成exe问题解决贴

    项目上做一个小工具,通过webservice接口实现配置下发.python文件调试通过了,想把它抓换成exe,网上查了下,得知有py2exe这个好用精简的小工具,本以为分分钟搞定的事情,结果经历了九转 ...