内部排序与外部排序

1.内部排序

Comparable接口。若一个类实现了Comparable接口,表明该类具有天然的可比较特性。(和其它类比)

int compareTo() 
=0,表示两对象相等;
>0,表示当前对象大于目标对象;
<0,表示当前对象小于目标对象。

内部比较代码示例:

package com.xunpu.a_7_29;
//内部排序
// 内部比较器 该类继承Comparable接口并覆写了compare(o)
//对Person类按照年龄升序排序
class Person implements Comparable{
    private int age;
    private String name;

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        Person p= (Person) o;
        return Integer.compare(this.age,p.age);
    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

public class TestCompare {
    //内部排序工具类
    public static void sort(Object[] obj){
        //传入一个对象数组,对对象进行排序
        Comparable[] ce= (Comparable[]) obj;
        for(int i=0;i<ce.length-1;i++){
            for(int j=0;j<ce.length-i-1;j++){
                if(ce[j].compareTo(ce[j+1])>0){
                    //交换位置
                    Comparable temp=ce[j];
                    ce[j]=ce[j+1];
                    ce[j+1]=temp;
                }
            }
        }
    }
    public static void main(String[] args) {
        Person[] parr=new Person[4];
        parr[0]=new Person(19,"张三");
        parr[1]=new Person(20,"李四");
        parr[2]=new Person(5,"王五");
        parr[3]=new Person(10,"史诗");
        sort(parr);
        for(Person p:parr){
            System.out.println(p.toString());
        }
    }

}

2.外部排序(推荐)

Comparator接口。该类本身不具备天然的比较特性,专门有一个类来比较两个Person对象的大小关系(Person的比较器)。

int compare(Object o1,Object o2)
-1:o1>o2(降序)
1:o1<o2(升序)
0:两个对象相等。

外部比较代码示例:

package com.xunpu.a_7_29;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

//外部排序
//专门定义一个比较对象的类并且该类实现Comparator接口,覆写compare()比较两个对象。
class Student {
    private int age;
    private String class_name;
    
    public int getAge() {
        return age;
    }
    public Student(int age, String class_name) {
        this.age = age;
        this.class_name = class_name;
    }
    public String getClass_name() {
        return class_name;

    }


    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", class_name='" + class_name + '\'' +
                '}';
    }

}
//定义Student的比较器  按照年龄升序、班级降序排序
class StuCompare implements Comparator{

    @Override
    public int compare(Object o1, Object o2) {
        Student p1= (Student) o1;
        Student p2= (Student) o2;
        int ageRes=Integer.compare(p1.getAge(),p2.getAge());
        if(ageRes!=0){
            return ageRes;
        }else{
            return -1*p1.getClass_name().compareTo(p2.getClass_name());
        }
    }
}
public class TestOutCompare {
    public static void main(String[] args) {
        //第一种写法
        Student[] students=new Student[5];
        students[0]=new Student(12,"class1");
        students[1]=new Student(3,"class2");
        students[2]=new Student(20,"class3");
        students[3]=new Student(16,"class2");
        students[4]=new Student(12,"class4");

        Arrays.sort(students,new StuCompare());
        for(Student s:students){
            System.out.println(s);
        }
        System.out.println("=========================");
//第二种写法,使用TreeSet:
        Set<Student> set=new TreeSet<>(new StuCompare());
        for(int i=0;i<5;i++){
            set.add(students[i]);
        }
        for(Student s:set){
            System.out.println(s);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值