前言

转自: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方法之比较,集合中对象的比较的更多相关文章

  1. java中compareTo和compare方法之比较

    这两个方法经常搞混淆,现对其进行总结以加深记忆. compareTo(Object o)方法是java.lang.Comparable接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comp ...

  2. Java分享笔记:使用entrySet方法获取Map集合中的元素

    /*--------------------------------- 使用entrySet方法取出Map集合中的元素: ....该方法是将Map集合中key与value的关系存入到了Set集合中,这 ...

  3. 解决PNG图片在IE6中背景不透明方法_解决IE6中PNG背

    解决PNG图片在IE6中背景不透明方法_解决IE6中PNG背   目录 解决代码 解决png图片在html中 解决png作为网页背景-css 1.解决PNG图片在IE6中背景不透明的CSS与JS代码 ...

  4. 【转载】C#中使用Average方法对List集合中相应元素求平均值

    在C#的List集合操作中,有时候需要对List集合元素进行汇总求平均值,如数值类型的List集合元素,有时候对象类型的List集合也需要对集合中的元素的某个对象进行汇总求平均值,此时都可以使用到Av ...

  5. 【转载】 C#中使用Count方法获取List集合中符合条件的个数

    很多时候操作List集合的过程中,我们需要根据特定的查询条件,获取List集合中有多少个实体对象符合查询条件,例如一批产品的对象List集合,如果这批产品的不合格数量大于10则重点备注.在C#中可以自 ...

  6. C#中字符串大小比较函数--CompareTo与Compare方法(需要完善补充)

    字符串比较的原理是什么? 原理: 从两个字符串的第一个字符开始逐个进行比较(按字符的ASCII值进行大小比较),直到出现不同的字符或遇到‘\0’为止. 如果全部字符都相同,就认为两字符串相等,返回0: ...

  7. Java分享笔记:使用keySet方法获取Map集合中的元素

    /*--------------------------- Map集合中利用keySet方法获取所有的元素值: ....keySet方法:将Map中的所有key值存入到Set集合中, ....利用Se ...

  8. java 数据类型:<泛型>在方法中和在构造器中的应用

    背景: Java不允许我们把对象放在一个未知的集合中. import java.util.ArrayList; import java.util.List; /** * @ClassName Meth ...

  9. 【Java面试题】54 去掉一个Vector集合中重复的元素

    在Java中去掉一个 Vector 集合中重复的元素 1)通过Vector.contains()方法判断是否包含该元素,如果没有包含就添加到新的集合当中,适用于数据较小的情况下. import jav ...

随机推荐

  1. 设置loadrunner中每个mdrv.exe进程中包含的vuser个数

    设置loadrunner中每个mdrv.exe进程中包含的vuser个数 在loadrunner中,默认的是每50个vuser会使用一个mdrv.exe进程,但是有些时候vuser中的使用的线程太多就 ...

  2. windows 安装tp5 composer方式

    1.下载windows composer-setup.exe(我已下载一个Composer-Setup.exe); 2.我电脑使用的是phpstudy2018版 php-7.0.12-NTS 3.然后 ...

  3. 【转】Python高级特性——切片(Slice)

    摘录廖雪峰网站 定义一个list: 1 L = ['haha','xixi','hehe','heihei','gaga'] 取其前三个元素: >>> L[0],L[1],L[2] ...

  4. Codeforces 1082 C. Multi-Subject Competition-有点意思 (Educational Codeforces Round 55 (Rated for Div. 2))

    C. Multi-Subject Competition time limit per test 2 seconds memory limit per test 256 megabytes input ...

  5. JS获取当前页面URL的方法

    1.JS获取当前页面URL的方法小结 ①. document.URL;                           http://localhost:81/Test/1.htm/id/12 ② ...

  6. 洛谷 P2947 [USACO09MAR]向右看齐Look Up【单调栈】

    题目描述 Farmer John's N (1 <= N <= 100,000) cows, conveniently numbered 1..N, are once again stan ...

  7. 使用CSS让元素尺寸缩小时保持宽高比例一致

    CSS中有一个属性padding对元素宽度存在依存关系.如果一个元素的 padding属性以百分比形式表示,padding 的大小是以该元素自身宽度为参照的. 若想要元素尺寸变化时,宽高比例不变,可以 ...

  8. UML动态模型(顺序图、协作图、状态图)

    顺序图:用来表示用例中的行为顺序,当执行一个用例行为时,顺序图中的每条信息 对应了一个类操作或状态机中引起转换的事件.顺序图展示对象之间的交互,这些交互是指在场景或用例的时间六中发生的,顺序图属于动态 ...

  9. tomcat服务器上web项目日志存放位置

    1.找到log日志的配置文件:log.xml,或者log.property,找到rollingFile标签,该标签的fileName属性就是更新的日志文件的存放位置.(相对于tomcat的bin目录)

  10. 【并查集】Gym - 101128B - Black Vienna

    有26张牌(A~Z),其中三张被拿走了.其余23张被分发给了两个人.给你m次调查结果,一次调查结果是对其中一个人询问一对牌,他会告诉你他有这对牌的几张(0~2).问你有多少种被拿走的牌的组合. 三重循 ...