回 帖 发 新 帖 刷新版面

主题:关于对象数组的排序,请教!

请大虾帮我解释下这个对象数组排序是怎么实现的,我主要看不懂其中红色的方法是如何实现的,不知道那个方法中是哪个对象传给Object o, 问号语句中的s.num和num又分别是什么?
class ArrayTest
{
    public static void main(String[] args)
    {
        Student[] st=new Student[]{new Student("zhagnshan",3),
                new Student("lishi",2),
                new Student("wangwu",1)};
    java.util.Arrays.sort(st);
        for(int i=0;i<st.length;i++)
        {
        System.out.println(st[i]);
        }
    }
}

class Student implements Comparable
{
    int num;
    String name;
    Student(String name,int num)
    {
        this.name=name;
        this.num=num;
    }
        public String toString()
        {
            return "num "+num+" is "+name;
        }
        [color=FF0000]public int compareTo(Object o)
        {
            Student s=(Student)o;
            return num>s.num?1:(num==s.num?0:-1);
        }[/color]}

回复列表 (共4个回复)

沙发

你的Student类实现了Comparable接口,而这个接口里有一个Compareto()方法
,进行自然排序,所以你需要把Compareto()函数实现,写好规则,当java.util.Arrays.sort(st);方法执行时,会自动执行。
num和s.num就是当前对象的num和待比较的对象的num,也就是this.num和s.num
不知道楼主对此回答满意与否


板凳

java.util.Arrays

sort
public static void sort(Object[] a)根据元素的自然顺序,对指定对象数组按升序进行排序。数组中的所有元素都必须实现 Comparable 接口。此外,数组中的所有元素都必须是可相互比较的(也就是说,对于数组中的任何 e1 和 e2 元素而言,e1.compareTo(e2) 不得抛出 ClassCastException)。
保证此排序是稳定的:不会因调用 sort 方法而对相等的元素进行重新排序。

该排序算法是一个经过修改的合并排序算法(其中,如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。此算法提供可保证的 n*log(n) 性能。 


参数:
a - 要排序的数组。 
抛出: 
ClassCastException - 如果数组包含不可相互比较的 的元素(例如,字符串和整数)。

3 楼

这样写,参考,自己就可以 看 : 方法中是哪个对象传给Object o, 问号语句中的s.num和num又分别是什么

public int compareTo(Object o) {
        
        Student s = (Student) o;
        
        System.out.println("name : "+this.name);
        System.out.println("num : "+this.num);
        System.out.println("s.name : "+s.name);
        System.out.println("s.num : "+s.num);
        
        System.out.println("compare result : "+(num > s.num ? 1 : (num == s.num ? 0 : -1)));

        System.out.println("\n------------------\n");

        
        
        return num > s.num ? 1 : (num == s.num ? 0 : -1);
    }

4 楼

谢谢了,按楼上这样一操作,看得清楚多了,基本上也了解了运行原理,也同样谢谢一二楼的朋友!
我的理解是:基本上这个方法是自动排序,从第一个对象挨个和其他对象比较,再将第二个对象和其余对象比较,最后排出自然序列,有点像排列组合的方式进行比较,不知我的理解对不对?

我来回复

您尚未登录,请登录后再回复。点此登录或注册