我通过Comparetor实现了按照对象的一个属性进行排序。但是怎么实现按照对象的两个属性或者三个属性进行排序呢?
我代码在下面:
class Test{
public static A a1=new A("001","a","哈哈~",7);
public static A a2=new A("001","c","哈哈~",9);
public static A a3=new A("001","b","哈哈~",3);
public static A a4=new A("000","d","哈哈~",6);
public static void main(String[] args){
A[] voA=new A[]{a1,a2,a3,a4};
java.util.Arrays.sort(voA,new Mycomparator()); A[] newA=new A[voA.length]; for(int i=0;i<voA.length;i++)
System.out.println("["+i+"]:"+voA[i].A1+" "+voA[i].A2+" "+voA[i].A3+" "+voA[i].A4);
}
}class A
{
String A1;
String A2;
String A3;
int A4;
public A(String oA1,String oA2,String oA3,int oA4){
this.A1=oA1;
this.A2=oA2;
this.A3=oA3;
this.A4=oA4;
}}class Mycomparator implements java.util.Comparator{
public int compare(Object o1,Object o2){
A a1=(A)o1;
A a2=(A)o2;
if(a1.A1.equals(a2.A1)){/*这里我想通过两个判断来实现先按照A1来排序,再按照A2来排序,可惜实现不了*/
if(a1.A2.equals(a2.A2))
return 1;
else
return 0;
}
else
return -1;
}
}哪位高手给点建议,如何实现按照两个或者三个属性来排序。
我代码在下面:
class Test{
public static A a1=new A("001","a","哈哈~",7);
public static A a2=new A("001","c","哈哈~",9);
public static A a3=new A("001","b","哈哈~",3);
public static A a4=new A("000","d","哈哈~",6);
public static void main(String[] args){
A[] voA=new A[]{a1,a2,a3,a4};
java.util.Arrays.sort(voA,new Mycomparator()); A[] newA=new A[voA.length]; for(int i=0;i<voA.length;i++)
System.out.println("["+i+"]:"+voA[i].A1+" "+voA[i].A2+" "+voA[i].A3+" "+voA[i].A4);
}
}class A
{
String A1;
String A2;
String A3;
int A4;
public A(String oA1,String oA2,String oA3,int oA4){
this.A1=oA1;
this.A2=oA2;
this.A3=oA3;
this.A4=oA4;
}}class Mycomparator implements java.util.Comparator{
public int compare(Object o1,Object o2){
A a1=(A)o1;
A a2=(A)o2;
if(a1.A1.equals(a2.A1)){/*这里我想通过两个判断来实现先按照A1来排序,再按照A2来排序,可惜实现不了*/
if(a1.A2.equals(a2.A2))
return 1;
else
return 0;
}
else
return -1;
}
}哪位高手给点建议,如何实现按照两个或者三个属性来排序。
我在实现Comparator接口时,如何使用泛型,不需要再把Object类型转为A类型。
1、将A中的三个属性封装起来,提供一对get/set方法
2、将设置的值放到ArrayList<A>数组里面
3、Test类实现implements接口,对需要排序的字段按照自己的写的规则进行排序
class Test implements Comparable<ArrayList<A>>{
...
public int compareTo(ArrayList<A> o)
{
return 0;
}
......
}
class Test implements Comparable{
public int compare(Object o1,Object o2){ {
A a1=(A)o1;
A a2=(A)o2;
if(a1.A1==a2.A1&&a1.A2==a2.A2&&a1.A3==a2.A3) retrun 0;
int i=a1.A1>a2.A1?1:(a1.A2>a2.A2?1:(a1.A3>a2.A3?1:-1))
return i;
}
}
你先试一下这个 至于泛型 这个如果这个算法可以 再给你写上加泛型的
class Test implements Comparable{
public int compare(Object o1,Object o2){ {
A a1=(A)o1;
A a2=(A)o2;
if(a1.A1==a2.A1&&a1.A2==a2.A2&&a1.A3==a2.A3) retrun 0;
int i=(a1.A1>a2.A1?1:(a1.A2>a2.A2?1:(a1.A3>a2.A3?1:-1)));
return i;
}
}
class Test implements Comparable<A>{
public int compare(A a1,A a2){ {
if(a1.A1==a2.A1&&a1.A2==a2.A2&&a1.A3==a2.A3) retrun 0;
int i=(a1.A1>a2.A1?1:(a1.A2>a2.A2?1:(a1.A3>a2.A3?1:-1)));
return i;
}
}这个加了泛型 没测试过 楼主测试下
public int compare(Object o1, Object o2) {
A a1 = (A) o1;
A a2 = (A) o2;
if(a1.A1.compareTo(a2.A1)!=0) {
return a1.A1.compareTo(a2.A1);
} else if(a1.A2.compareTo(a2.A2)!=0) {
return a1.A2.compareTo(a2.A2);
} else if(a1.A3.compareTo(a2.A3)!=0) {
return a1.A3.compareTo(a2.A3);
} else {
return a1.A4 >a2.A4?1:a1.A4==a2.A4?0:-1;
}
}
不好意思啊class Test implements Comparator<A>{
public int compare(A a1,A a2){ {
if(a1.A1==a2.A1&&a1.A2==a2.A2&&a1.A3==a2.A3) retrun 0;
int i=(a1.A1>a2.A1?1:(a1.A2>a2.A2?1:(a1.A3>a2.A3?1:-1)));
return i;
}
}
public int compare(A a1,A a2){ {
if(a1.A1==a2.A1&&a1.A2==a2.A2&&a1.A3==a2.A3) retrun 0;
int i=(a1.A1.compareTo(a2.A1)>1?1:(a1.A2.compareTo(a2.A2)>1?1:(a1.A3.compareTo(a2.A3)>1?1:-1)));
return i;
}
}
呵呵 错了 写错了 class Test implements Comparator<A>{
public int compare(A a1,A a2){ {
if(a1.A1==a2.A1&&a1.A2==a2.A2&&a1.A3==a2.A3) retrun 0;
int i=(a1.A1.compareTo(a2.A1)>0?1:(a1.A2.compareTo(a2.A2)>0?1:(a1.A3.compareTo(a2.A3)>0?1:-1)));
return i;
}
}我做事老是马虎 呵呵
/////////////////////////////////////////
if(a1.A1==a2.A1&&a1.A2==a2.A2&&a1.A3==a2.A3) retrun 0;
int i=(a1.A1.compareTo(a2.A1)>0?1:(a1.A2.compareTo(a2.A2)>0?1:(a1.A3.compareTo(a2.A3)>0?1:-1)));
return i;
////////////////////////////////////////
这个不行,还是用下面这个吧,
if(a1.A1.compareTo(a2.A1)!=0) {
return a1.A1.compareTo(a2.A1);
} else if(a1.A2.compareTo(a2.A2)!=0) {
return a1.A2.compareTo(a2.A2);
} else if(a1.A3.compareTo(a2.A3)!=0) {
return a1.A3.compareTo(a2.A3);
} else {
return a1.A4 >a2.A4?1:a1.A4==a2.A4?0:-1;
}