有Person类如下:

1 class Person {
2   String name;
3   int age;
4   String address;
5 }

有main如下:

 1 import java.util.TreeSet;
 2
 3 public class Test{
 4   public static void main(String[] args){
 5     Person p1 = new Person("AA",18,"CN");
 6     Person p2 = new Person("BB",18,"JP");
 7     Person p3 = new Person("CC",18,"CN");
 8
 9     TreeSet<Person> persons = new TreeSet<>();
10     persons.add(p1);
11     persons.add(p2);
12     persons.add(p3);
13     for (Object person : persons) {
14       System.out.println(person);
15     }
16   }
17 }

由于TreeSet为可排序集合,所以要为存放对象(Person)指定排序规则。

排序规则:ASC(升序),age > address > name
故重写Person的compareTo():

 1 public int compareTo(Person o) {
 2     if(this.age > o.age){
 3         return 1;
 4     }else if(this.age < o.age) {
 5         return -1;
 6     }
 7     //判断age谁大,若相等,则判断address
 8     int x = this.address.compareTo(o.address);
 9     if(x != 0){
10         return x;
11     }
12     //判断address谁大,若相等,则判断name
13     return this.name.compareTo(o.name);
14 }

注:若要DESC排序:

  1、age比较中交换1/-1;
  2、address比较中return相反数值;
  3、name比较中return相反数值;

上述代码的逻辑顺序:
  传入比较对象o与自身进行对比;
    若this.age > o.age,返回“1”;
    若this.age < o.age,返回“-1”;
    若相等,比较address;
  令x = this.address.compareTo(o.address);
    若x != 0,即不相等,x即为要返回的值(1/-1);
    若x == 0,即相等,比较name;
  this.name.compareTo(o.name)的值即为要返回的值:
    若值为 1,即大于,
    若值为-1,即为小于,
    若值为 0,即三处均相等,则完全相等,不应存入。

完整代码:

 1 package toBKY;
 2
 3 import java.util.TreeSet;
 4
 5 public class Test{
 6     public static void main(String[] args){
 7         Person p1 = new Person("AA",18,"CN");
 8         Person p2 = new Person("BB",18,"JP");
 9         Person p3 = new Person("CC",18,"CN");
10
11         TreeSet<Person> persons = new TreeSet<>();
12         persons.add(p1);
13         persons.add(p2);
14         persons.add(p3);
15
16         for (Object person : persons) {
17             System.out.println(person);
18         }
19         //使用for each 比Iterator代码量少
20
21     }
22 }
23
24 class Person implements Comparable<Person>{
25     String name;
26     int age;
27     String address;
28
29     public Person(String name, int age, String address) {
30         this.name = name;
31         this.age = age;
32         this.address = address;
33     }
34
35     @Override
36     public String toString() {
37         return "Person{" +
38             "name='" + name + '\'' +
39             ", age=" + age +
40             ", address='" + address + '\'' +
41          '}';
42   }
43
44   @Override
45   public int compareTo(Person o) {
46     if(this.age > o.age){
47       return 1;
48     }else if(this.age < o.age) {
49       return -1;
50     }
51     //判断age谁大,若相等,则判断address
52     int x = this.address.compareTo(o.address);
53     if(x != 0){
54       return x;
55     }
56     //判断address谁大,若相等,则判断name
57     return this.name.compareTo(o.name);
58   }
59 }

转载于:https://www.cnblogs.com/ram314/p/8451827.html

180217_JAVA学习_TreeSet中存放含多个String的类并设置排序规则相关推荐

  1. 表中记录查询排序(设置排序规则)

    --先创建一个表  create table ai(  id int not null,  no varchar(10) not null  )  go --往表中插入数据  insert into ...

  2. 使用Spring JPA中Page、Pageable接口和Sort类完成分页排序

    显示时,有三个参数,前两个必填,第几页,一页多少个size,第三个参数默认可以不填. 但是发现这个方法已经过时了,通过查看它的源码发现,新方法为静态方法PageRequest of(page,size ...

  3. SQL Server 与 MySQL 中排序规则与字符集相关知识的一点总结

    字符集&&排序规则 字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码.排序规则则是在特定字符集 ...

  4. sqlserver中的字符编码、排序规则、nvarchar和varchar、大N‘‘

    环境: sqlserver 2014 window 10 建议先阅读<细说ASCII.GB2312/GBK/GB18030.Unicode.UTF-8/UTF-16/UTF-32编码> 先 ...

  5. 【安卓学习之第三方库】 ZlwAudioRecorder学习:内部流程(含aar文件生成)

    █ [安卓学习之第三方库] ZlwAudioRecorder学习:内部流程(含aar文件生成) █ 系列文章目录 提示:这里是收集了安卓学习之常见问题的相关文章 [安卓学习之MP3] MP3读取格式 ...

  6. 编程统计BUF字单元数据中所含1的个数,并将结果存入COUNT单元中。

    编程统计BUF字单元数据中所含1的个数,并将结果存入COUNT单元中. 代码如下: DATA SEGMENT BUF DW 2345H ;随机存储一下数据 COUNT DB ? ;用于统计BUF字单元 ...

  7. vb.net调用oracle存储过程,vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc...

    vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc 我的VBNETORACLE增删改查学习笔记(本源码在VBNET2008下测试通过)学习VBNET有一段时间了,之 ...

  8. Python 中的可执行对象 eval,exec 和 compile与其在深度学习训练中的应用实例

    Python 中的可执行对象 eval,exec 和 compile 与其在深度学习训练中的应用实例 eval 计算指定表达式的值.也就是说它要执行的python代码只能是单个表达式(注意eval不支 ...

  9. CMU | 深度学习模型中集成优化、约束和控制

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作分享,不代表本公众号立场,侵权联系删除 转载于:专知 AI博士笔记系列推荐 周志华<机器学习>手推笔 ...

最新文章

  1. python转换维度
  2. 射频篇(一) 模拟、射频器件学习(1) —— 晶振(OSC)
  3. nasa数据库cm1数据集_获取下一个地理项目的NASA数据
  4. DGL实现同构/异构图卷积模型
  5. jQuery中的$.grep()方法的使用
  6. 三门问题的MonteCarlo仿真方法
  7. 网管学习日记-STP
  8. 飞翔pdf生成html,pdf转换成html转换器
  9. AB PLC和ESD维护及灯的含义
  10. win10红警2黑屏_Windows10黑屏常见情况及解决办法
  11. Nginx subs_filter模块替换文本
  12. linux服务器默认使用中文字符集zh_CN.UTF-8
  13. Python爬虫selenium的使用实例爬取知乎首页数据!
  14. ad软件one pin错误是啥意思_AD错误中英文对照
  15. Arcpy基础入门-3、arcpy创建地理处理工具
  16. pyhton爬取武汉地铁信息
  17. 电竞英雄联盟数据API接口 - 【近期赛事列表】API调用示例代码
  18. BCD码与16进制互转算法(转)
  19. GNU-Radio简介
  20. 神经反馈3——标准训练方案

热门文章

  1. Transact_SQL小手册
  2. AtlasControlToolkit.CascadingDropDownNameValue自定义用法
  3. 从理论到实践,机器人SLAM技术详解
  4. AI人工智能工程师 学习大纲
  5. narwal无法连接机器人_懒无止境 能自己洗抹布的云鲸J1扫拖机器人
  6. unity导出fbx模型_ARTBOOK艺书专栏:Fbx导出杂谈
  7. Oracle DML、DDL、DCL的区别
  8. 025_Jedis集群
  9. JavaScript在发送ajax请求时,URL域名地址是使用绝对地址还是相对地址?什么是浏览器跨域访问操作,js如何实现?
  10. The application's PagerAdapter changed the adapter's contents without calling notifyDataSetChanged