有的时候我们需要将自己定义的对象,有序输出。因为一般我们程序的中间结果需要存储在容器里,那么怎样对容器中的对象按照一定次序输出就是程序员经常需要考虑的问题。本片文章探讨了怎样有序化输出容器中的对象的问题。涉及的库包括Guava和JDK API.

  1. 使用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中对象排序的一些探讨(一)的更多相关文章

  1. [个人原创]关于java中对象排序的一些探讨(三)

    这篇文章由十八子将原创,转载请注明,并标明博客地址:http://www.cnblogs.com/shibazijiang/ 对对象排序也可以使用Guava中的Ordering类. 构造Orderin ...

  2. [个人原创]关于java中对象排序的一些探讨(二)

    2.  使用Collections.sort()方法 Collections类中提供了诸多静态方法,诸如addAll(),max()等等.当自己相对Collection接口下的类处理的时候,可以看看这 ...

  3. Comparable与Comparator,java中的排序与比较

    1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如s ...

  4. Java中对象的生与灭- 核心篇

    前言 大家好啊,我是汤圆,今天给大家带来的是<Java中对象的生与灭- 核心篇>,希望对大家有帮助,谢谢 文章纯属原创,个人总结难免有差错,如果有,麻烦在评论区回复或后台私信,谢啦 简介 ...

  5. Java中的排序算法(2)

    Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...

  6. Java中对象的深复制和浅复制详解

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...

  7. java 中对象比较大小

    java 中对象比较大小 java 中对象比较大小有两种方法 1:实现Comparable 接口 的 public int compareTo(T o) 方法: 2:实现Comparator 接口 的 ...

  8. Java中对象、对象引用、堆、栈、值传递以及引用传递的详解

    Java中对象.对象引用.堆.栈.值传递以及引用传递的详解 1.对象和对象引用的差别: (1).对象: 万物皆对象.对象是类的实例. 在Java中new是用来在堆上创建对象用的. 一个对象能够被多个引 ...

  9. Java中对象流使用的一个注意事项

    再写jsp的实验作业的时候,需要用到java中对象流,但是碰到了之前没有遇到过的情况,改bug改到崩溃!!记录下来供大家分享 如果要用对象流去读取一个文件,一定要先判断这个文件的内容是否为空,如果为空 ...

随机推荐

  1. c#:for循环;穷举,迭代 练习

    一)穷举 1. 第x种买法:羽毛球拍xx个,羽毛球xx个,水xx瓶 2. 单位给发了一张150元购物卡,拿着到超市买三类洗化用品.     洗发水15元,香皂2元,牙刷5元.求刚好花完150元,有多少 ...

  2. Android 判断wifi和4G网络是否开启

    public boolean isWifiAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) g ...

  3. android利用反射通过代码收缩通知栏

    最近有个需求,点击通知栏RemoteView中的按钮后要收起通知栏,系统默认是不自动收起的,不过没有找到公开的API可以控制通知栏. 在android.app.StatusBarManager里提供了 ...

  4. Hibernate 配置详解(3)

    7) hibernate.max_fetch_depth: 该属性用于设置left out join单对象查询关系(one-to-one/many-to-one)中最大的关联深度.默认值为0,即默认情 ...

  5. BZOJ 1055 [HAOI2008]玩具取名

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1119  Solved: 653[Submit][Statu ...

  6. 「Poetize7」电话线路

    描述 每台电话都有一个独一无二的号码,用一个十位的十进制数字串表示.电话a和b之间能直接通信,当且仅当“a与b之间仅有一个数字不同”,或者“交换a的某 两位上的数字后,a与b相同”.而a.b之间建立通 ...

  7. Qt入门(19)——自定义窗口部件

    我们介绍可以画自己的第一个自定义窗口部件.我们也加入了一个有用的键盘接口.我们添加了一个槽:setRange().        void setRange( int minVal, int maxV ...

  8. CodeForces 220(div 2)

    悲剧的div2..... A 题意:在n * m的矩形平面直角坐标系中,从(x, y)可以到四个点(x - a, y - b),(x + a, y - b),(x - a, y + b),(x + a ...

  9. 上海Uber优步司机奖励政策(1月18日~1月24日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  10. crossfire 346# B

    Vasya has the square chessboard of size n × n and m rooks. Initially the chessboard is empty. Vasya ...