import java.util.Arrays;
import java.util.Comparator;
public class ComparatorTest {
private static class Person{
final String name;//姓名
final Integer money;//钱数
public Person(String name, Integer money) {
this.name = name;
this.money = money;
}
public String toString(){
return "["+name+":"+money+"]";
}
}
public static void main(String[] args) {
//这是一群人,现在要根据钱数和姓名,对他们排序。
Person[] persons = new Person[]{
new Person("Tom",200),
new Person("Adom",200),
new Person("Mark",200)
};
//排序的规则是,钱少的排在前面,一样多的,按照姓名的字母顺序排列,不区分大小写。
Arrays.sort(persons,new Comparator<Person>(){
@Override
public int compare(Person p1, Person p2) {
int result = p1.money > p2.money? 1 : p1.money == p2.money? 0 :-1;
if(result ==0){
result = p1.name.compareToIgnoreCase(p2.name);
}
return result;
}
});
//输出结果
System.out.println(Arrays.toString(persons));
}
}
解决方案 »
- java字符日期处理
- 急救:救急:急急救:java.io.IOException: 远程主机强迫关闭了一个现有的连接。是服务器端的问题呢?还是客户端的问题呢?
- 一个小程序
- 如何用readLine()把所有的行都读出来
- java.io程序中的字符集问题,高手帮着看!
- 高手帮帮忙!
- 请教各位大侠一个小问题。
- 一个小问题
- ---===WWW.7-8-9.NET程序源JAVA版期待着您的加盟===---
- cannot convert from Map<String,String[]> to Map<String,Object>
- 解析Java中抽象类和接口的区别
- 急求org.apache.commons.net.ftp.FTPClient 各超时方法意义
new Person("Adom",200),
new Person("Mark",200)
貌似基本类型的包装类的==和equals方法都是默认比较内置的值的大小的吧??
public static void main(String[] args) {
//这是另外三个人,他们也想比一比,到底谁的钱多
Person[] persons = new Person[]{
new Person("Tom",100),
new Person("Adom",100),
new Person("Mark",100)
};
//排序的规则是,钱少的排在前面,一样多的,按照姓名的字母顺序排列,不区分大小写。
Arrays.sort(persons,new Comparator<Person>(){
@Override
public int compare(Person p1, Person p2) {
int result = p1.money > p2.money? 1 : p1.money == p2.money? 0 :-1;
if(result ==0){
result = p1.name.compareToIgnoreCase(p2.name);
}
return result;
}
});
//输出结果
System.out.println(Arrays.toString(persons));
}
当然不是,两个Integer直接用==作比较,那是比较它们的HashCode(好久没用Java了,不知道说得对不对,反正肯定不是比较它们各自存放的数字)
(1)jdk5以后引入了自动拆装箱机制,Integer i = 1;实际上等价于:Integer i = Integer.valueOf(1);而Integer之所以能直接比较大小,也是因为自动拆箱的缘故,因此Integer i > 10;是合法的。但是,Person p > 10;那肯定是无法编译通过的。
(2)Integer内部缓存了-128到127共256个Integer实例,对于这256个实例,只要是在自动装箱的场合,总是返回这256个实例,因此,内存地址是一模一样的。这里跟equals没有一毛钱关系,因为本来他们就是同一个对象。不在这个范围以内的数字,Integer.valueOf()返回的是一个新对对象,内存上地址是不一样的,除非重写equals,否则是不能用==来判断的。我说的够明白了吗?