[个人原创]关于java中对象排序的一些探讨(一)
有的时候我们需要将自己定义的对象,有序输出。因为一般我们程序的中间结果需要存储在容器里,那么怎样对容器中的对象按照一定次序输出就是程序员经常需要考虑的问题。本片文章探讨了怎样有序化输出容器中的对象的问题。涉及的库包括Guava和JDK API.
- 使用TreeMap 或者TreeSet按照一定次序来存储对象
㈠ TreeSet是通过TreeMap实现的。
原生java库已经提供两个容器TreeMap、TreeSet。但是因为这两个集合类有这密切的关系。将TreeMap的键值设置为NULL,那么TreeMap就变成了TreeSet。看看jdk api文档中关于TreeSet一节,第一句就是A NavigableSet implementation based on a TreeMap。这句话意思是一个NavigableSet的实现类都是基于TreeMap,而TreeSet实现了NavigableSet,从这儿可以发现二者之间的密切关系了吧.
㈡ 对存入对象的要求
下面的这段话来自于TreeMap的API文档中。
Note that the ordering maintained by a tree map, like any sorted map, and whether or not an explicit comparator is provided, must be consistent with equals if this sorted map is to correctly implement the Map interface. (See Comparable or Comparator for a precise definition of consistent with equals.) This is so because the Map interface is defined in terms of the equals operation, but a sorted map performs all key comparisons using its compareTo (or compare) method, so two keys that are deemed equal by this method are, from the standpoint of the sorted map, equal. The behavior of a sorted map is well-defined even if its ordering is inconsistent with equals; it just fails to obey the general contract of the Map interface.
说明一个类存入TreeSet和TreeMap的时候,是调用Comparator来比较是否存入的键与已经存在的键冲突的。
因此,将一个对象存入TreeSet和TreeMap的时候,一定要传入一个Comparator方法。同时注意一定要用Comparator来严格区分每一个元素。
import java.util.Set;
import java.util.TreeSet;
class Person implements Comparable<Person> {
private String name;
private int age; //构造器
public Person() {
} public Person(String name, int age) {
this.setAge(age);
this.setName(name);
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public int compareTo(Person o) {
int i = new Integer(o.getAge()).compareTo(new Integer(this.getAge()));
if (i != 0) {
return i;
}
return this.getName().compareTo(o.getName());
}
} public class Test {
public static void main(String[] args) {
Set<Person> set = new TreeSet();
set.add(new Person("十八子", 24));
set.add(new Person("十八子", 25));
set.add(new Person("大连", 20));
set.add(new Person("北京", 20));
set.add(new Person("北京", 33));
set.add(new Person("北京", 26)); for (Person person : set) {
System.out.println(String.format("名字是:%s,年龄是:%d",
person.getName(), person.getAge()));
}
} }
输出结果:
名字是:北京,年龄是:33
名字是:北京,年龄是:26
名字是:十八子,年龄是:25
名字是:十八子,年龄是:24
名字是:北京,年龄是:20
名字是:大连,年龄是:20
本程序是让类直接实现Comparable接口。也可以在新建Set对象的时候,传入一个比较器。参考下面的代码。输出结果同上,不再贴出。
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
class Person {
private String name;
private int age; //构造器
public Person() {
} public Person(String name, int age) {
this.setAge(age);
this.setName(name);
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} } public class Test {
public static void main(String[] args) {
Set<Person> set = new TreeSet(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
int i = new Integer(o2.getAge()).compareTo(new Integer(o1.getAge()));
if (i != 0) {
return i;
}
return o1.getName().compareTo(o2.getName());
}
});
set.add(new Person("十八子", 24));
set.add(new Person("十八子", 25));
set.add(new Person("大连", 20));
set.add(new Person("北京", 20));
set.add(new Person("北京", 33));
set.add(new Person("北京", 26)); for (Person person : set) {
System.out.println(String.format("名字是:%s,年龄是:%d",
person.getName(), person.getAge()));
}
} }
[个人原创]关于java中对象排序的一些探讨(一)的更多相关文章
- [个人原创]关于java中对象排序的一些探讨(三)
这篇文章由十八子将原创,转载请注明,并标明博客地址:http://www.cnblogs.com/shibazijiang/ 对对象排序也可以使用Guava中的Ordering类. 构造Orderin ...
- [个人原创]关于java中对象排序的一些探讨(二)
2. 使用Collections.sort()方法 Collections类中提供了诸多静态方法,诸如addAll(),max()等等.当自己相对Collection接口下的类处理的时候,可以看看这 ...
- Comparable与Comparator,java中的排序与比较
1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如s ...
- Java中对象的生与灭- 核心篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中对象的生与灭- 核心篇>,希望对大家有帮助,谢谢 文章纯属原创,个人总结难免有差错,如果有,麻烦在评论区回复或后台私信,谢啦 简介 ...
- Java中的排序算法(2)
Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...
- Java中对象的深复制和浅复制详解
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...
- java 中对象比较大小
java 中对象比较大小 java 中对象比较大小有两种方法 1:实现Comparable 接口 的 public int compareTo(T o) 方法: 2:实现Comparator 接口 的 ...
- Java中对象、对象引用、堆、栈、值传递以及引用传递的详解
Java中对象.对象引用.堆.栈.值传递以及引用传递的详解 1.对象和对象引用的差别: (1).对象: 万物皆对象.对象是类的实例. 在Java中new是用来在堆上创建对象用的. 一个对象能够被多个引 ...
- Java中对象流使用的一个注意事项
再写jsp的实验作业的时候,需要用到java中对象流,但是碰到了之前没有遇到过的情况,改bug改到崩溃!!记录下来供大家分享 如果要用对象流去读取一个文件,一定要先判断这个文件的内容是否为空,如果为空 ...
随机推荐
- HDU 5452 Minimum Cut
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5452题目大意: 给你一个图G,图中包含一颗生成树.要求只能删除生成树内的一条边,使得图不联通.问最小的删除 ...
- Linux系统下UDP发送和接收广播消息小例子
// 发送端 #include <iostream> #include <stdio.h> #include <sys/socket.h> #include < ...
- 【宽搜】Vijos P1360 八数码问题
题目链接: https://vijos.org/p/1360 题目大意: 3x3格子上放1~8数字,一个空位,每次空位可与上下左右交换,固定终止布局,求输入的起始布局需要几步到达终止布局 题目思路: ...
- 转:给C++初学者的50个忠告
转:给C++初学者的50个忠告 1.把C++当成一门新的语言学习(和C没啥关系!真的.): ...
- Java---实力弹弹球,弹弹弹
直接上代码了. 微调按钮加画布画几个圆,再实现监听... package cn.hncu.threadDemo.thread2; import java.awt.Canvas; import java ...
- 数据库系统概论 SQL
--(一)创建教材学生-课程数据库 create database s_c go use s_c go --建立“学生”表Student,学号是主码,姓名取值唯一. CREATE TABLE Stud ...
- 迷宫 maze
1 #include <stdlib.h> #include <stdio.h> #define stackinitsize 50 #define stackincrement ...
- M - 昂贵的聘礼 - poj1062
Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...
- Linux crontab相关
定时自动启动任务crontab命令 文章目录 [隐藏] crontab简介 crontab用法 crontab例子 每个操作系统都有它的自动定时启动程序的功能,Windows有它的任务计划,而Linu ...
- MySQL更新时Error Code:1093和Error Code:1175的解决办法
Error Code: 1093. You can't specify target table 'ws_product' for update in FROM clause 这个是我们在使用upda ...