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 ...
随机推荐
- 学习LoadRunner之C语言函数
学习LoadRunner之C语言函数 Action() { /*strchr和strrchr的区别*/ /* char *strTest1="citms citms"; char ...
- 微软企业库5.0 学习之路——第四步、使用缓存提高网站的性能(EntLib Caching)
首先先补习下企业库的Caching Application Block的相关知识: 1.四大缓存方式,在Caching Application Block中,主要提供以下四种保存缓存数据的途径,分别是 ...
- Ubuntu18.04 安装Chrome浏览器
一路copy paste就OK sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/sources. ...
- python打印所有汉字
n=0 for ch in xrange(0x4e00, 0x9fa6): print unichr(ch), n = n+1 if(n%50==0): print '\n' print n
- Java工具类-设置字符编码
package common; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.Filter ...
- Sqli-labs介绍、下载、安装
SQLI和sqli-labs介绍 SQLI,sql injection,我们称之为sql注入.何为sql,英文:Structured Query Language,叫做结构化查询语言.常见的结构化数据 ...
- [Codeforces #210] Tutorial
Link: Codeforces #210 传送门 A: 贪心,对每个值都取最大值,不会有其他解使答案变优 #include <bits/stdc++.h> using namespace ...
- BZOJ 3127 [Usaco2013 Open]Yin and Yang(树点分治)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3127 [题目大意] 给出一棵01边权树,求存在多少条路径,使得路径上0和1的数量相同, ...
- 【贪心】POJ2393-Yogurt Factory
[思路] 水题,没什么好说的.每周为之后多生产的牛奶可以看作之后才生产的.每周最少生产单价=min(上周生产的最小单价+储存单价,本周生产单价).注意ans是long long,否则会WA. #inc ...
- (疯狂java)第四课(上)
趁着周末玩爽了,兴致来了,继续玩玩java(估计再玩下去,就要被java玩了),第六章实在是很长,那就两个阶段来看吧. 1.java 7的增强包装类 这些包装类就是java上的基本类型,只不过人人基本 ...