有的时候我们需要将自己定义的对象,有序输出。因为一般我们程序的中间结果需要存储在容器里,那么怎样对容器中的对象按照一定次序输出就是程序员经常需要考虑的问题。本片文章探讨了怎样有序化输出容器中的对象的问题。涉及的库包括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. Android Wear开发 - 数据通讯 - 第四节 : 数据封装(解决不能序列化问题)

    一. 前言 背景 一开始笔者在研究数据发送与接收的时候,看到Wear数据类DataMap除了可以put基本类型外,还有个fromBundle方法来构建一个DataMap对象.所以一口气的将原本功能上的 ...

  2. Linux [Ubuntu 12.0.1] 常用命令

    1.文件名颜色的含义1)默认色代表普通文件.例:install.log2)绿色代表可执行文件.例:rc.news3)红色代表tar包 文件. 例:vim-7.1.tar.bz24)蓝色代表目录文件. ...

  3. Unity NGUI中动态添加和删除sprite

    (以后,参考链接和作者将在文章首部给出,转载请保留此部分内容) 参考链接:http://www.narkii.com/club/thread-299977-1.html,作者:纳金网 比巴卜: 参考链 ...

  4. 【转】Android:Layout_weight的深刻理解

    原文网址:http://mobile.51cto.com/abased-375428.htm 本文详细介绍了Android布局中Layout_weight的属性,它是用来分配属于空间的一个属性,你可以 ...

  5. PHP删除数组中特定元素

    方法一: <?php $arr1 = array(1,3, 5,7,8); $key = array_search(3, $arr1); if ($key !== false) array_sp ...

  6. Find Minimum in Rotated Sorted Array——LeetCode

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  7. android导入项目出错处理

    问题: 执行Import-Android下的Existing Android Code Into Workspace 解决方法:

  8. MySQL选用可重复读之前一定要想到的事情

    原文地址:http://blog.itpub.net/29254281/viewspace-1398273/ MySQL选用可重复读隔离级别之前一定要想到的事情.间隙锁 MySQL在使用之前有三个务必 ...

  9. poj2406 Power Strings(kmp失配函数)

    Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 39291 Accepted: 16315 Descr ...

  10. zznu 1073: 海军节上的鸣炮声计算

    这是个一不留神就会出错的题目,首先大家可以想到在同一时间可能会有多个炮同时发射,不过观众只能听到一响,所以需要注意! 而且刚开始的时候所有的船都会发射一发,输入的a, b, c,都是时间间隔,