对于对象的sort排序。
sort的排序对于对象,需要在类中实现comparable接口和comparaTo方法,我疑惑的是,实现这个方法是什么意思?为什么要规定大就是1,等于是0,小于是-1?对于排序有什么影响?如果有2个int成员变量,我想对a变量升序排列,或者对他降序排列,需要怎么实现comparaTo方法?麻烦举个简单的例子,这里不是很明白comparato的作用,谢谢
----------------解决方案--------------------------------------------------------
就是说,如果你想对自己写的类排序,你就把自己写的这个类实现Comparable接口,然后写一个comparaTo方法来规定这个类的对象排序的顺序。
在这个方法中,如果返回-1,则当前对象排前面,返回1,就排后面,0,就相等。例如:
import java.util.*;
public class A {
public static void main(String args[]) {
Example e1 = new Example(), e2 = new Example(), e3 = new Example();
e1.i = 1;
e2.i = 2;
e3.i = 3;
List l = new ArrayList();
l.add(e1);
l.add(e2);
l.add(e3);
Collections.sort(l);
for(int i = 0; i < l.size(); i++) {
System.out.println(l.get(i));
}
}
}
class Example implements Comparable {
int i;
public int compareTo(Object o) {
if (this.i > ((Example)o).i ) return -1;
else if (this.i < ((Example)o).i ) return 1;
else return 0;
}
public String toString() {
return "Example" + this.i;
}
}
Example是自定义写的类,里面就一个int成员i。我们就可以根据这个i的大小来排序。在compareTo方法中,我定义了如果i大,那么就返回-1,则该对象就跑到前面去了。当然,如果你想定义i大的应该往后排,那么你可以改变返回值,从-1改为1。就是说 ,if里面是你要比较的条件,你可以根据这个条件来返回-1,0,1来将符合条件的对象放到前面、后面或者是不变。
在main方法中,我新建了3个Example对象,里面的i是1,2,3。注意我放入的顺序,是e1,e2,e3,当我调用sort方法后,再看输出结果,可以看到是e3,e2,e1,顺序跟我放入的顺序是相反的。就是这样实现排序的。
----------------解决方案--------------------------------------------------------
上面是放到一个List里面的。下面这个程序是一个Example数组:
import java.util.*;
public class A {
public static void main(String args[]) {
Example[] l = { new Example(1), new Example(4), new Example(6) };
Arrays.sort(l);
for (int i = 0; i < l.length; i++) {
System.out.println(l[i]);
}
}
}
class Example implements Comparable {
Example() {
}
Example(int i) {
this.i = i;
}
int i;
public int compareTo(Object o) {
if (this.i > ((Example) o).i)
return -1;
else if (this.i < ((Example) o).i)
return 1;
else
return 0;
}
public String toString() {
return "Example" + this.i;
}
}
这样看起来简单点,直接建一个Example的数组,用Arrays.sort排序......
----------------解决方案--------------------------------------------------------
是不是这个意思?
sort排序是升序的,只不过sort不知道要排对象的哪个变量?
如果我通过j排,那么我就可以定义 j>(o.j)?1:(j==o.j)?0:-1);
----------------解决方案--------------------------------------------------------
comparato的作用只是告诉sort对哪个排序?
----------------解决方案--------------------------------------------------------
compareTo方法里面决定了你自己的排序顺序,可以升序,也可以降序。这个方法返回-1的就排前面,返回1的就排后面,返回0的不变
----------------解决方案--------------------------------------------------------
if (this.i > ((Example) o).i)
return -1;
else if (this.i < ((Example) o).i)
return 1;
else
return 0;
这么排就是降序吧?
如果是升序就是这个么?
if (this.i > ((Example) o).i)
return 1;
else if (this.i < ((Example) o).i)
return -1;
else
return 0;
那么和大于小于有什么关系?
----------------解决方案--------------------------------------------------------
如果没有大于小于你怎么比?比的是两个相同类型的对象啊,总得有一个属性来比吧。
this.i > ((Example)o).i return -1,通过这个我们就知道i大的返回-1,从而排在前面形成降序
----------------解决方案--------------------------------------------------------
普通排序是基于比较的,两个对象比较总要有个理由决定谁大。
----------------解决方案--------------------------------------------------------
终于懂了。。。郁闷。。
就是基于 对象中某个变量来排序,如果想让他降序就是当大于时候返回-1,升序就是小于时候返回-1,对吧
----------------解决方案--------------------------------------------------------