java中compareTo和compare方法之比较,集合中对象的比较
前言
转自:http://www.cnblogs.com/yueliming/archive/2013/05/22/3092576.html
(这里做了一些小改动)
一直一来对集合中对象的比较方案,有些模糊,这里做些总结:
有两个方法可以实现:
1. 让 Student 实现Comparable接口:
compareTo(Object o)方法是java.lang.Comparable<T>接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable<T>接口的,必须重写public int compareTo(T o)方法。
2. 实例化一个比较器:
compare(Object o1,Object o2)方法是java.util.Comparator<T>接口的方法,它实际上用的是待比较对象的compareTo(Object o)方法。
注意:两者对于比较此对象与指定对象的顺序:如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数:
返回整数,1,-1,0;返回1表示大于,返回-1表示小于,返回0表示相等。
代码
1. 实现Comparable接口:
package com.horizon.action; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; public class Student implements Comparable { private int id;
private int age;
private String name; public Student(int id) {
this.id = id;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} 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 static void main(String args[]) {
List<Student> list = new ArrayList<Student>();
for (int i = ; i > ; i--) {
list.add(new Student(i));
} Collections.sort(list); for (Student s : list) {
System.out.println(s.getId());
}
} public int compareTo(Object o) {
if (o instanceof Student) {
Student s = (Student) o;
if (this.id > s.id) {
return ;
} else {
return ;
}
}
return -;
} }
2. 实例化一个比较器MenuComparator:
package com.horizon.action;
import java.util.Comparator;
public class MenuComparator implements Comparator {
public int compare(Object o1, Object o2) {
if (null != o1 && null != o2) {
Menu menu1 = (Menu) o1;
Menu menu2 = (Menu) o2;
if (menu1.getId() > menu2.getId()) {
return ;
} else {
return ;
}
}
return ;
}
}
package com.horizon.action; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; public class Menu { private int id;
private int age;
private String name; public Menu(int id) {
this.id = id;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} 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 static void main(String args[]) {
List<Menu> list = new ArrayList<Menu>();
for (int i = ; i > ; i--) {
list.add(new Menu(i));
} for (Menu m : list) {
System.out.println(m.getId());
}
Collections.sort(list,new MenuComparator()); for (Menu m : list) {
System.out.println(m.getId());
}
}
}
3.两个合体:
package com.horizon.action;
public class User implements Comparable<Object> {
int id;
String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
/*
* Getters and Setters
*/
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;
}
@Override
public int compareTo(Object o) {
if (this == o) {
return ;
} else if (o != null && o instanceof User) {
User u = (User) o;
if (id <= u.id) {
return -;
} else {
return ;
}
} else {
return -;
}
}
}
package com.horizon.action; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; public class Test {
// 编写Comparator,根据User的id对User进行排序
private static final Comparator<User> COMPARATOR = new Comparator<User>() {
public int compare(User o1, User o2) {
return o1.compareTo(o2);// 运用User类的compareTo方法比较两个对象
}
}; public static void main(String[] args) {
List<User> student = new ArrayList<User>();
User user1 = new User(, "yueliming");
User user2 = new User(, "yueliming");
student.add(user2);
student.add(user1);
Collections.sort(student, COMPARATOR);// 用我们写好的Comparator对student进行排序
for (int i = ; i < student.size(); i++) {
System.out.println(student.get(i).getId());
}
}
}
java中compareTo和compare方法之比较,集合中对象的比较的更多相关文章
- java中compareTo和compare方法之比较
这两个方法经常搞混淆,现对其进行总结以加深记忆. compareTo(Object o)方法是java.lang.Comparable接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comp ...
- Java分享笔记:使用entrySet方法获取Map集合中的元素
/*--------------------------------- 使用entrySet方法取出Map集合中的元素: ....该方法是将Map集合中key与value的关系存入到了Set集合中,这 ...
- 解决PNG图片在IE6中背景不透明方法_解决IE6中PNG背
解决PNG图片在IE6中背景不透明方法_解决IE6中PNG背 目录 解决代码 解决png图片在html中 解决png作为网页背景-css 1.解决PNG图片在IE6中背景不透明的CSS与JS代码 ...
- 【转载】C#中使用Average方法对List集合中相应元素求平均值
在C#的List集合操作中,有时候需要对List集合元素进行汇总求平均值,如数值类型的List集合元素,有时候对象类型的List集合也需要对集合中的元素的某个对象进行汇总求平均值,此时都可以使用到Av ...
- 【转载】 C#中使用Count方法获取List集合中符合条件的个数
很多时候操作List集合的过程中,我们需要根据特定的查询条件,获取List集合中有多少个实体对象符合查询条件,例如一批产品的对象List集合,如果这批产品的不合格数量大于10则重点备注.在C#中可以自 ...
- C#中字符串大小比较函数--CompareTo与Compare方法(需要完善补充)
字符串比较的原理是什么? 原理: 从两个字符串的第一个字符开始逐个进行比较(按字符的ASCII值进行大小比较),直到出现不同的字符或遇到‘\0’为止. 如果全部字符都相同,就认为两字符串相等,返回0: ...
- Java分享笔记:使用keySet方法获取Map集合中的元素
/*--------------------------- Map集合中利用keySet方法获取所有的元素值: ....keySet方法:将Map中的所有key值存入到Set集合中, ....利用Se ...
- java 数据类型:<泛型>在方法中和在构造器中的应用
背景: Java不允许我们把对象放在一个未知的集合中. import java.util.ArrayList; import java.util.List; /** * @ClassName Meth ...
- 【Java面试题】54 去掉一个Vector集合中重复的元素
在Java中去掉一个 Vector 集合中重复的元素 1)通过Vector.contains()方法判断是否包含该元素,如果没有包含就添加到新的集合当中,适用于数据较小的情况下. import jav ...
随机推荐
- vault-in-kubernetes
http://www.devoperandi.com/vault-in-kubernetes-take-2/ https://www.usenix.org/sites/default/files/co ...
- 堆管理之malloc和free分析
在win7 64环境下分析 1.malloc代码 int main(){ void *p = malloc(0xa8); memset(p, 'a', 0xa8); free(p); return 0 ...
- js前端分享功能
直接添加网页分享代码就可以了.实现方法如下:1.打开百度分享:http://share.baidu.com.2.点击“代码获取”.3.进行个性化设置.
- 单例(LintCode)
单例 单例 是最为最常见的设计模式之一.对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计模式为单例.例如,对于 class Mouse (不是动物的mouse哦),我们应将其 ...
- 洛谷——P1190 接水问题
P1190 接水问题 题目描述 学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为 1. 现在有 n 名同学准备接水,他们的初始接水顺序已经确定.将这些同学 ...
- Linux基础系列-Day9
算术运算符 设置变量a=10,b=4 + 加法 [root@localhost ~]# echo $[$a+$b] 14 - 减法 [root@localhost ~]# echo $[$a-$b] ...
- mysql中timestamp类型的应用
在开发过程中我们一般需要记住某条记录的创建时间,在MySQL中如果使用dateTime类型的话,无法设定默认值,我们可以采用timestamp类型来记录创建时间.但是随之而来的有个问题,比如说你的这个 ...
- SPOJ Time Limit Exceeded(高维前缀和)
[题目链接] http://www.spoj.com/problems/TLE/en/ [题目大意] 给出n个数字c,求非负整数序列a,满足a<2^m 并且有a[i]&a[i+1]=0, ...
- [POI2010]Divine Divisor
[POI2010]Divine Divisor 题目大意: 给你\(m(m\le600)\)个数\(a_i(a_i\le10^{18})\).\(n=\prod a_i\).现在要你找到一个最大的\( ...
- Problem D: 结构体:计算输入日期是该年的第几天
#include <stdio.h> struct time{ int year; int month; int day;}; int main(void) { struct time s ...