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 ...
随机推荐
- HDU 1011 Starship Troopers【树形DP/有依赖的01背包】
You, the leader of Starship Troopers, are sent to destroy a base of the bugs. The base is built unde ...
- git add . 的时候遇到warning: LF will be replaced by CRLF in ...... 解决办法
输 入 git add . 后出现 warning: LF will be replaced by CRLF in ...... The file will have its original lin ...
- 面向对象编程课程(OOP)第二单元总结
一.设计策略 第一次作业(傻瓜式电梯): 由于是第一次写多线程作业,许多的知识还处在理论阶段,所以第一次作业写得非常的朴实无华.整个程序总共有四个类,Main类负责通过电梯类实例化一个电梯,然后通过w ...
- 27、Flask实战第27天:cms后台登录
cms后台登录界面 后台登录页面,我们不用自己写,只需要去Bootstrap中文网去找一个模板改一下就行 这里使用的模板是:https://v3.bootcss.com/examples/signin ...
- ansible用playbook实现定期监控各机器磁盘和进程状态
目标:用ansible定期监控各机器的磁盘空间状况 和进程运行状况 1)配置playbook脚本,实现对磁盘空间 和 特定进程运行状态的每日检查: 2)通过邮件插件,把检测结果发到ops邮箱: 一.p ...
- 初识C#设计模式
利用设计模式可以使我们的代码更灵活,更容易扩展,更容易维护.各种面向对象的程序设计语言都提供了基本相同的机制:比如类.继承.派生.多态等等.但是又有各自的特色,C# 中的反射机制便是一个很重要的工具, ...
- jvm 哪些是不会被gc回收的
韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com
- [BZOJ5248][九省联考2018]一双木棋(连通性DP,对抗搜索)
5248: [2018多省省队联测]一双木棋 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 43 Solved: 34[Submit][Status ...
- POJ 2425 A Chess Game 博弈论 sg函数
http://poj.org/problem?id=2425 典型的sg函数,建图搜sg函数预处理之后直接求每次游戏的异或和.仍然是因为看不懂题目卡了好久. 这道题大概有两个坑, 1.是搜索的时候vi ...
- HDU 6035 Colorful Tree(补集思想+树形DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6035 [题目大意] 给出一颗树,一条路径的价值为其上点权的种类数,求路径总价值 [题解] 单独考虑 ...