Java compare方法和compareTo方法

2,233 阅读1分钟

Comparator接口

compare排序方法

    public static void main(String[] args) {

        /**
         * 数组排序
         */
        Integer[]itg = new Integer[]{11,455,578,666};
        Arrays.sort(itg, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        });
        Arrays.stream(itg).forEach(integer -> System.out.println("-----" + integer));
        /**
         * list集合排序
        */
        List<String> list = Arrays.asList("asa","ab","asssa","aaff");
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return Integer.compare(o1.length(),o2.length());
            }
        });
        list.stream().forEach(s -> System.out.println(s));
        /**
         * list集合排序
         */
        List<String> listTo = Arrays.asList("b","a","aa","bb");
        Collections.sort(listTo, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
        listTo.stream().forEach(s -> System.out.println(s));
    }

输出

compare Integer.compare(o1,o2) o1 > o2  返回 1;o1 = o2 返回 0;o1 < o2  返回-1

compareTo  同 compare 方法的参数比较一样 返回1,0,-1

比较方法:

(1) 字符串与对象进行比较

(2) 按字典顺序比较两个字符串

比较过程:

先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至得到最终结果或者其中一个参数结束。

public class test {

    static class Student implements Comparable<Student>{
        private String name;
        private int age;
        private float score;

        public Student(String name, int age, float score) {
            this.name = name;
            this.age = age;
            this.score = score;
        }

        public String toString()
        {
            return name+"\t\t"+age+"\t\t"+score;
        }

        @Override
        public int compareTo(Student o) {
            // TODO Auto-generated method stub
            if(this.score>o.score)//score是private的,为什么能够直接调用,这是因为在Student类内部
                return -1;//由高到底排序
            else if(this.score<o.score)
                return 1;
            else{
                if(this.age>o.age)
                    return 1;//由底到高排序
                else if(this.age<o.age)
                    return -1;
                else
                    return 0;
            }
        }
    }

    public static void main(String[] args) {
        // 将学生先按成绩由大到小排名,成绩相同时候按照年龄由低到高排序。
        Student stu[]={new test.Student("zhangsan",20,90.0f),
                new test.Student("lisi",22,90.0f),
                new test.Student("wangwu",20,99.0f),
                new test.Student("sunliu",22,100.0f)};
        java.util.Arrays.sort(stu);
        for(Student s:stu){
            System.out.println(s);
        }
    }

}