`
zhangcong170
  • 浏览: 70980 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

说说java对象排序

    博客分类:
  • j2se
阅读更多

      在集合或者数组中,有时候需要对里面的元素,也就是对象进行排序,依照对象的某个或者某几个属性从大到小或者从小到大进行排序,我们可以采用直接编码的方式,将集合或者数组中的元素进行重新排列,但,采用java本身提供的接口,无疑是一种更有效的方法。

      java提供两种方式来提供比较功能。第一种是实现java.lang.Comparable接口,它有一个 int compareTo(Object o)方法,重写此方法即可。

package compare;

public class People implements Comparable {
	private int id;
	private String name;

	public People(int id,String name){
		this.id=id;
		this.name=name;
	}
	/*
	 * 这里表示按id从小到大排序,如果该对象小于、等于或大于指定对象Object o,则分别返回负整数、零或正整数
	 * 如果需要从大到小排序,则如果该对象小于、等于或大于指定对象Object o,则分别返回正整数、零或负整数
	 * @see java.lang.Comparable#compareTo(java.lang.Object)
	 */
	public int compareTo(Object o) {
		People people=(People)o;
		if(id<people.getId()){
			return -1;
		}
		if(id>people.getId()){
			return 1;
		}
		return 0;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

 测试代码如下:

		List peopleList = new ArrayList();
		peopleList.add(new People(2, "张三"));
		peopleList.add(new People(1, "李四"));
		peopleList.add(new People(0, "王五"));
		System.out.println("排序前");
		for (int i = 0; i < peopleList.size(); i++) {
			People people = (People) peopleList.get(i);
			System.out.println(people.getId() + " " + people.getName());
		}
		Collections.sort(peopleList);
		System.out.println("排序后");
		for (int i = 0; i < peopleList.size(); i++) {
			People people = (People) peopleList.get(i);
			System.out.println(people.getId() + " " + people.getName());
		}

 以下是输出结果:

排序前
2 张三
1 李四
0 王五
排序后
0 王五
1 李四
2 张三

 另一种方式是实现java.util.Comparator接口,重写int compare(Object o1, Object o2)方法即可。

package compare;

import java.util.Comparator;

public class Compare implements Comparator {

	/* 
	 * 这里表示按id从小到大排序,如果该对象o1小于、等于或大于指定对象o2,则分别返回负整数、零或正整数
	 * 如果需要从大到小排序,则如果对象o1小于、等于或大于指定对象o2,则分别返回正整数、零或负整数
	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
	 */
	public int compare(Object o1, Object o2) {
		Student s1=(Student)o1;
		Student s2=(Student)o2;
		if(s1.getId()<s2.getId()){
			return -1;
		}
		if(s1.getId()>s2.getId()){
			return 1;
		}
		return 0;
	}
}

 Student类代码如下:

package compare;

public class Student {
	private int id;
	private String name;

	public Student(int id, String name) {
		this.id = id;
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

 测试代码如下:

		List<Student> list = new ArrayList<Student>();
		Student s1 = new Student(1, "a");
		Student s2 = new Student(2, "b");
		Student s3 = new Student(3, "c");

		list.add(s3);
		list.add(s2);
		list.add(s1);

		System.out.println("排序前");
		for (int i = 0; i < list.size(); i++) {
			Student s = list.get(i);
			System.out.println(s.getId() + " " + s.getName());
		}
		Collections.sort(list, new Compare());
		System.out.println("排序后");
		for (int i = 0; i < list.size(); i++) {
			Student s = list.get(i);
			System.out.println(s.getId() + " " + s.getName());
		}

 结果如下:

排序前
3 c
2 b
1 a
排序后
1 a
2 b
3 c

 结果和预期是相同的。

这两种方法都可以实现按照对象的属性进行排序,或者自己定义排序规则,不过个人更倾向于使用第二种方式,因为这种方式对JavaBean不进行任何的修改,而且扩展起来也很方便

 

1
2
分享到:
评论
2 楼 zhangcong170 2010-12-15  
restart1107 写道
集合可以不用ArrayList,有TreeSet,它实现了sortedSet接口可以排序,直接add进去就可以了

额  List里面的元素可以重复 但是 Set里面的元素不能重复  如果你的元素集合中有重复的元素就不能使用Set。TreeSet默认提供一个Comparator来进行排序(SortedSet也是如此),当然你也可以自己指定一个Comparator的实现。请查看API和源码
1 楼 restart1107 2010-12-15  
集合可以不用ArrayList,有TreeSet,它实现了sortedSet接口可以排序,直接add进去就可以了

相关推荐

    Java 的常用包与数组的复制与排序27

    再来说说数组的排序。Java提供了`Arrays.sort()`方法来对数组进行排序: 1. 对于基本类型数组,如整数数组,可以直接调用`Arrays.sort(int[])`: ```java int[] arr = {5, 2, 8, 1, 9}; Arrays.sort(arr); ``` ...

    超级有影响力霸气的Java面试题大全文档

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    java 资源管理器

    这些功能可以通过Java的`java.io`包实现,例如使用`File`类来代表文件对象,调用其提供的方法完成操作。 2. 监听器:为了响应用户的交互,如点击、拖放等,我们需要添加事件监听器。例如,使用`...

    4-java常用API进阶类1

    Java的基本数据类型不能直接作为对象使用,为了支持面向对象编程,Java为每种基本数据类型都提供了一个对应的包装类,如`Integer`对应`int`,`Character`对应`char`。包装类提供了许多实用方法,比如`compareTo()`...

    Java面试宝典-经典

    用JAVA实现一个快速排序。 79 11、有数组a[n],用java代码将数组元素顺序颠倒 80 12.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-&gt;(一千零一拾一元整)输出。 81 三. html&JavaScript&ajax...

    IT java 面试题库

    1. **描述一下“Java中面向对象几个典型的面向对象特性”?** - **封装**: 封装是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类提供的公共(public)方法来实现对内部信息的操作...

    深入理解JAVA内存模型(高清完整版)

    同时,也会探讨Java内存模型是如何处理内存屏障、重排序以及 Happens-Before 规则等复杂概念。通过阅读《深入理解JAVA内存模型.pdf》和观看38套java高级架构视频教程,你将能更好地理解和应用这些知识,提升你的Java...

    Java应届生面试题1.doc

    每部分包含多个问题,涵盖 Java 面向对象编程、字符串处理、JSP programming、数据库操作和编程题等多个方面。 一、 Java 基础 1. 面向对象的特征有哪些方面?(8 分) Java 的面向对象编程特征有:封装、继承、...

    java面试题

    71.5. Hibernate 中Java对象的状态 58 71.5.1. 临时状态 (transient) 58 71.5.2. 持久化状态(persisted) 58 71.5.3. 游离状态(detached) 58 71.5.4. hibernate的三种状态之间如何转换 59 71.6. Hibernate并发机制,...

    java面试宝典

    java面试试题 全面 准确 带答案 coreJava部分 8 1、面向对象的特征有哪些方面? 8 2、作用域public,private,protected,以及不写时的区别? 8 3、String 是最基本的数据类型吗? 8 4、float 型float f=3.4是否正确? 8 ...

    最新Java面试宝典pdf版

    用JAVA实现一个快速排序。 79 11、有数组a[n],用java代码将数组元素顺序颠倒 80 12.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-&gt;(一千零一拾一元整)输出。 81 三. html&JavaScript&ajax...

    java抢票软件源码-interview:java面试题整理

    基本类型数据使用快速排序法,对象数组使用归并排序。 String,StringBuffer和StringBuilder的区别; 解答: Object的方法有哪些:比如有wait方法,为什么会有; 解答: wait和sleep的区别,必须理解!!! 解答: 强...

    java面试宝典2012

    用JAVA实现一个快速排序。 86 11、有数组a[n],用java代码将数组元素顺序颠倒 87 12.金额转换,阿拉伯数字的金额转换成中国传统的形式如:(¥1011)-&gt;(一千零一拾一元整)输出。 88 三. html&JavaScript;&ajax;...

Global site tag (gtag.js) - Google Analytics