/*
1. 往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。

2. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素
的比较规则定义在compareTo()方法上。

3. 如果比较元素的时候,compareTo方法返回的是0,那么该元素就被视为重复元素,不允许添加.
(注意:TreeSet与HashCode、equals方法是没有任何关系。)

4. 往TreeSet添加元素的时候, 如果元素本身没有具备自然顺序 的特性,而元素所属的类也没有实现Comparable接口,
那么必须要在创建TreeSet的时候传入一个比较器。

5. 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口,
在创建TreeSet对象的时候也传入了比较器那么是以 比较器的比较规则优先 使用。

如何自定义定义比较器: 自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在compare方法内即可。
*/

 class Employee implements Comparable<Employee> {
String name;
int id;
int salary; public Employee(String name, int id, int salary) {
this.name = name;
this.id = id;
this.salary = salary;
} @Override
public String toString() {
return "{name=" + name + ", id=" + id + ", salary=" + salary + "}";
} @Override
public int compareTo(Employee e) { // 负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
return this.salary - e.salary;
}
} // 自定义一个比较器
class MyComparator implements Comparator<Employee> {
@Override
public int compare(Employee o1, Employee o2) {
return o1.id - o2.id;
}
} public class Demo6 {
public static void main(String[] args) {
// 用Comparable接口,此时比较salary
TreeSet tree = new TreeSet();
tree.add(new Employee("Jay", 1, 1000));
tree.add(new Employee("Lee", 4, 3000));
tree.add(new Employee("MJ", 2, 2000));
tree.add(new Employee("JK", 3, 500)); System.out.println("用Comparable接口,此时比较salary");
Iterator it = tree.iterator();
while (it.hasNext()) {
System.out.println(it.next());
} System.out.println("*******************"); // 用Comparator比较器,此时比较id
MyComparator comparator = new MyComparator();// 创建一个比较器对象
TreeSet tree2 = new TreeSet(comparator); // 创建TreeSet的时候传入比较器
tree2.add(new Employee("Jay", 1, 1000));
tree2.add(new Employee("Lee", 4, 3000));
tree2.add(new Employee("MJ", 2, 2000));
tree2.add(new Employee("JK", 3, 500)); System.out.println("用Comparator比较器,此时比较id");
Iterator it2 = tree2.iterator();
while (it2.hasNext()) {
System.out.println(it2.next());
}
} }

结果为:

用Comparable接口,此时比较salary
{name=JK, id=3, salary=500}
{name=Jay, id=1, salary=1000}
{name=MJ, id=2, salary=2000}
{name=Lee, id=4, salary=3000}
*******************
用Comparator比较器,此时比较id
{name=Jay, id=1, salary=1000}
{name=MJ, id=2, salary=2000}
{name=JK, id=3, salary=500}
{name=Lee, id=4, salary=3000}

TreeSet对非自然顺序元素的排序的更多相关文章

  1. Java基础面试操作题:读取该文件内容,并按照自然顺序排序后输出到 另一个文件中

    package com.swift; import java.io.FileInputStream; import java.io.FileNotFoundException; import java ...

  2. Java基础知识强化之集合框架笔记43:Set集合之TreeSet存储Integer类型的元素并遍历

    1. TreeSet类概述: • 能够对元素按照某种规则进行排序. • 或者根据创建set时提供的Comparator进行排序 • 具体取决于使用的构造方法 2. 代码示例: package cn.i ...

  3. JAVA之旅(二十)—HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习

    JAVA之旅(二十)-HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习 我们继续说一下集合框架 Set:元素是无序(存入和取出的顺序不一定 ...

  4. leetcode【1403. 非递增顺序的最小子序列】(01)

    题目描述: 给你一个数组 nums,请你从中抽取一个子序列,满足该子序列的元素之和 严格 大于未包含在该子序列中的各元素之和. 如果存在多个解决方案,只需返回 长度最小 的子序列.如果仍然有多个解决方 ...

  5. 【LeetCode】1403. 非递增顺序的最小子序列 Minimum Subsequence in Non-Increasing Order

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心 日期 题目地址:https://leetcode ...

  6. JQuery利用sort对DOM元素进行排序

    前言 排序对于我们是再熟悉不过了,在绝大数应用程序中都会有这样一个场景:当我们从服务器端获取一个列表时,在界面上进行渲染,我们可以会依赖于某一个规则来进行排序,当然此时绝大多数会再次与服务器进行交互来 ...

  7. sort() 方法用于对数组的元素进行排序

    语法 arrayObject.sort(sortby) 参数 描述 sortby 可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意,数组在原数组上进行排序,不生成副本. 说明 如果调用该 ...

  8. 对数组元素进行排序的方法总结(利用C++)

    首先,对数组元素进行排序方法总结为以下两类: 一.简单排序算法(时间复杂度O(n*n)) 1.插入排序 2.选择排序 3.交换排序,即冒泡排序 二.先进排序算法(时间复杂度O(n*logn)) 1.快 ...

  9. [ActionScript 3.0] 对数组中的元素进行排序Array.sort()的方法

    对数组中的元素进行排序. 此方法按 Unicode 值排序. (ASCII 是 Unicode 的一个子集.) 默认情况下,Array.sort()按以下方式进行排序: 1. 排序区分大小写(Z优先于 ...

随机推荐

  1. 前端学PHP之Smarty模板引擎

    前面的话 对PHP来说,有很多模板引擎可供选择,但Smarty是一个使用PHP编写出来的,是业界最著名.功能最强大的一种PHP模板引擎.Smarty像PHP一样拥有丰富的函数库,从统计字数到自动缩进. ...

  2. 日历组件的使用,bootstrap-datetimepicker

    官方文档:http://www.bootcss.com/p/bootstrap-datetimepicker/ .html <input name="createdTimeEnd&qu ...

  3. 面向对象的三大特征——封装、继承、多态(&常用关键字)

    一.封装 Encapsulation 在面向对象程式设计方法中,封装是指,一种将抽象性函式接口的实作细节部份包装.隐藏起来的方法. 封装的概念(针对服务器开发,保护内部,确保服务器不出现问题) 将类的 ...

  4. HackerRank The Chosen One [预处理][gcd]

    题解:tags:[预处理][gcd]故事背景:光头钻进了茫茫人海.这是一个典型の通过前缀后缀和来降低复杂度的问题.先用pre数组与suf数组分别维护前缀gcd和后缀gcd.如果 a[i] % gcd( ...

  5. Truncated incorrect DOUBLE value错误

    mysql报错:Truncated incorrect DOUBLE value sql的update语法错误eg: update Person set name = 'auhnayuiL' and ...

  6. [原]C#与非托管——封送和自动封送

    之前说到了如何从C函数声明通过简单的查找替换生成一份C#的静态引用声明(C#与非托管——初体验),因为只是简单说明,所以全部采用的是基础类型匹配和自动封送.自动封送虽然能省去我们不少编码时间,但如果不 ...

  7. 老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串

    老李推荐:第6章2节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-获取命令字串   从上一节的描述可以知道,MonkeyRunner发送给Monkey的命令 ...

  8. 关于WdatePicker.js的结束时间大于开始时间

    简单笔记 : WdatePicker.js 要使结束时间大于开始时间只要在线束时间的 minDate:'#F{$dp.$D(\'stimeParam\')}' 即可:不多说 详细代码如下: <t ...

  9. Java中执行shell笔记

    在java中执行shell有好几种方式:第一种(exec)方式一 public static synchronized void runshell2() {    File superuser = n ...

  10. Spring基础学习(四)—AOP

    一.AOP基础 1.基本需求      需求: 日志功能,在程序执行期间记录发生的活动. ArithmeticCalculate.java public interface ArithmeticCal ...