TreeSet对非自然顺序元素的排序
/*
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对非自然顺序元素的排序的更多相关文章
- Java基础面试操作题:读取该文件内容,并按照自然顺序排序后输出到 另一个文件中
package com.swift; import java.io.FileInputStream; import java.io.FileNotFoundException; import java ...
- Java基础知识强化之集合框架笔记43:Set集合之TreeSet存储Integer类型的元素并遍历
1. TreeSet类概述: • 能够对元素按照某种规则进行排序. • 或者根据创建set时提供的Comparator进行排序 • 具体取决于使用的构造方法 2. 代码示例: package cn.i ...
- JAVA之旅(二十)—HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习
JAVA之旅(二十)-HashSet,自定义存储对象,TreeSet,二叉树,实现Comparator方式排序,TreeSet小练习 我们继续说一下集合框架 Set:元素是无序(存入和取出的顺序不一定 ...
- leetcode【1403. 非递增顺序的最小子序列】(01)
题目描述: 给你一个数组 nums,请你从中抽取一个子序列,满足该子序列的元素之和 严格 大于未包含在该子序列中的各元素之和. 如果存在多个解决方案,只需返回 长度最小 的子序列.如果仍然有多个解决方 ...
- 【LeetCode】1403. 非递增顺序的最小子序列 Minimum Subsequence in Non-Increasing Order
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心 日期 题目地址:https://leetcode ...
- JQuery利用sort对DOM元素进行排序
前言 排序对于我们是再熟悉不过了,在绝大数应用程序中都会有这样一个场景:当我们从服务器端获取一个列表时,在界面上进行渲染,我们可以会依赖于某一个规则来进行排序,当然此时绝大多数会再次与服务器进行交互来 ...
- sort() 方法用于对数组的元素进行排序
语法 arrayObject.sort(sortby) 参数 描述 sortby 可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意,数组在原数组上进行排序,不生成副本. 说明 如果调用该 ...
- 对数组元素进行排序的方法总结(利用C++)
首先,对数组元素进行排序方法总结为以下两类: 一.简单排序算法(时间复杂度O(n*n)) 1.插入排序 2.选择排序 3.交换排序,即冒泡排序 二.先进排序算法(时间复杂度O(n*logn)) 1.快 ...
- [ActionScript 3.0] 对数组中的元素进行排序Array.sort()的方法
对数组中的元素进行排序. 此方法按 Unicode 值排序. (ASCII 是 Unicode 的一个子集.) 默认情况下,Array.sort()按以下方式进行排序: 1. 排序区分大小写(Z优先于 ...
随机推荐
- Windows 10 IoT Serials 7 – 如何用树莓派制作家庭流媒体播放器
Windows 10平台引入了AllJoyn开源软件框架,它提供了一组服务可以创建动态近端网络,让设备可以相互连接实现功能交互.目前,AllJoyn开源软件框架由AllSeen联盟负责管理.AllSe ...
- WebService客户端添加SOAPHeader信息
通过JAXBContext创建Marshaller对头信息进行解析为dom,获取WSBindingProvider,使用Headers.creat()创建soap的Header元素: 另外就是:将us ...
- iOS开发之KVC
1.KVC概述 KVC(Key-value coding)是一套利用字符串标识符间接访问对象属性和关系的机制.Cocoa Programming中,Core Data,Application Scri ...
- nodejs 使用mongoose 操作mongodb
nodejs操作mongodb可以使用mongoose: Mongoose is a MongoDB object modeling tool designed to work in an async ...
- Linux之kill,pkill,killall命令
kill,pkill,killall这些命令都是用来杀死进程的 查找进程的方法: ps -ef|grep pidof 进程名 ps命令 http://www.cnblogs.com/along1226 ...
- pg_config executable not found
Error: pg_config executable not found. Please add the directory containing pg_config to the PATH or ...
- 02.PHP7.x编译详解
#php7编译安装安装 ``` useradd -M -s /sbin/nologin www yum -y install openssl-devel bzip2-devel curl-devel ...
- 自动生成并导出word文档
今天很荣幸又破解一现实难题:自动生成并导出word文档 先看页面效果: word效果: 代码: 先搭建struts2项目 创建action,并在struts.xml完成注册 <?xml vers ...
- 微信小程序评分功能
很多做过电商项目的朋友会经常用到评分的功能,我这里正好写了一个例子,发出来分享一下: 我写的是5分满分制的,首先,准备3个图片, ,像这样的,分别代表分数为0,0.5,1 时的状态, 效果图:(以3. ...
- 存储linux RAID6被重建成RAID5的数据恢复解决方案
数据恢复故障描述:原存储为12块2T硬盘组成的Linux RAID6,文件系统均为EXT3,此存储上划有3个LUN,每个均为6TB大小,某天在RAID失效后,维护人员为了抢救数据,对此失效的存储重进行 ...