数组对象排序:Comparable和Comparator

相同:

Comparable和Comparator都是用来实现对象的比较、排序

要想对象比较、排序,都需要实现Comparable或Comparator接口

Comparable和Comparator都是Java的接口

不同:

Comparator位于java.util包下,而Comparable位于java.lang包下

Comparable接口的实现是在类的内部(如 String、Integer已经实现了Comparable接口,自己就可以完成比较大小操作),Comparator接口的实现是在类的外部(可以理解为一个是自已完成比较,一个是外部程序实现比较)

实现Comparable接口要重写compareTo方法,实现Comparator需要重写 compare 方法

总结:

如果比较的方法只要用在一个类中,用该类实现Comparable接口就可以

如果比较的方法在很多类中需要用到,就自己写个类实现Comparator接口,这样当要比较的时候把实现了Comparator接口的类传过去就可以,省得重复造轮子。这也是为什么Comparator会在java.util包下的原因。
使用Comparator的优点是:1.与实体类分离 2.方便应对多变的排序规则

1.1实体类User.java

内部排序:comparable

import java.util.Comparator;

public class User implements  Comparable{
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public User() {
    }

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

    //先年龄再姓名
    @Override
    public int compareTo(Object o) {
        User temp= (User) o;
        int i=this.age-temp.getAge();
        if (i==0){
            return this.name.compareTo(temp.getName());
        }else{
            return  i;
        }
    }
}

1.2实体类User.java

内部排序:comparator

import java.util.Comparator;

public class User implements Comparator<User>{
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public User() {
    }

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

    @Override
    public int compare(User user1, User user2) {
        if (user1.getName().equals(user2.getName())) {
            return user1.getAge() - user2.getAge();
        } else {
            return user1.getName().compareTo(user2.getName());
        }
    }
}

2.比较器:实现外部排序 comparator(只适用外部排序2,也可以static方法写在实体类)

import java.util.Comparator;

public class UserComparator implements Comparator<User> {
    //先姓名再年龄
    @Override
    public int compare(User user1, User user2) {
        if (user1.getName().equals(user2.getName())) {
            return user1.getAge() - user2.getAge();
        } else {
            return user1.getName().compareTo(user2.getName());
        }
    }
}

3.测试类:

import java.util.*;

public class Main {

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        UserComparator uc = new UserComparator();
        User u1 = new User("manu", 21);
        User u2 = new User("sas", 20);
        User u3 = new User("manu", 20);
        list.add(u1);
        list.add(u2);
        list.add(u3);
        //内部排序
        //前面大 > 正数;相等 = 0;前者小 < 负数
        System.out.println(u1.compareTo(u2));
        System.out.println(uc.compare(u1, u2));
        Collections.sort(list);
        System.out.println("comparable:");
        for (User user : list) {
            System.out.println(user.getName() + ":" + user.getAge());
        }
        //外部排序1
        Collections.sort(list, new Comparator<User>() {
            @Override
            public int compare(User user1, User user2) {
                if (user1.getName().equals(user2.getName())) {
                    return user1.getAge() - user2.getAge();
                } else {
                    return user1.getName().compareTo(user2.getName());
                }
            }
        });
        //外部排序2
        Collections.sort(list, uc);
        //外部排序3
        Collections.sort(list,new User());
        System.out.println("comparator:");
        for (User user : list) {
            System.out.println(user.getName() + ":" + user.getAge());
        }
    }

}

测试结果:

comparable:
manu:20
sas:20
manu:21
comparator:
manu:20
manu:21
sas:20

备注:

JDK8也可用Lambda表达式写

时间: 2024-08-29 03:16:57

数组对象排序:Comparable和Comparator的相关文章

js中的数组对象排序

一.普通数组排序 js中用方法sort()为数组排序.sort()方法有一个可选参数,是用来确定元素顺序的函数.如果这个参数被省略,那么数组中的元素将按照ASCII字符顺序进行排序.如: var arr = ["a", "b", "A", "B"]; arr.sort(); console.log(arr);//["A", "B", "a", "b"

javascript数组对象排序

javascript数组对象排序 JavaScript数组内置排序函数 javascript内置的sort函数是多种排序算法的集合 JavaScript实现多维数组.对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序. sort() 方法用于对数组的元素进行排序.语法如下: ArrayObject.sort(order); 测试A: var mm=[1,4,0,6,3,1,2]; mm.sort(); alert(mm);//0 1 1 2 3 4 6 返回值为对数组的引

js中的数组对象排序(方法sort()详细介绍)

定义和用法 sort() 方法用于对数组的元素进行排序. 语法    arrayObject.sort(sortby) 参数sortby:可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意,数组在原数组上进行排序,不生成副本. 普通数组排序: js中用方法sort()为数组排序.sort()方法有一个可选参数,是用来确定元素顺序的函数.如果这个参数被省略,那么数组中的元素将按照ASCII字符顺序进行排序.如: 字母A.B的ASCII值分别为65.66,而a.b的值分别为97.98,所

使用vue实现数组对象排序

从网上找到的例子用vue来实现数组对象排序 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-U

数组对象排序

函数主体 var byFromMin = function(name){//从小到大排序     return function(o,p){ var a, b; if(typeof o === "object" && typeof p === "object" && o && p) { a = parseInt(o[name]) || o[name]; b = parseInt(p[name]) || p[name];

Array.prototype.sort()对数组对象排序的方法

Array.prototype.sort()方法接受一个参数——Function,Function会提供两个参数,分别是两个进行比较的元素,如果元素是String类型则通过Unicode code进行比较,如果是Number类型则比较值的大小.如果比较的函数中返回1则两个元素交换位置,0和-1不交换位置. var arr = [3, 5, 2, 1]; // 从小到大排序 arr.sort(function(a, b){ return a > b ? 1 : -1; }); // 得到的结果:[

java集合中对象某属性比较排序Comparable与Comparator

要对集合中的对象的某属性进行排序有两种方式. a. 一种是要排序对象类实现comparable接口的compareTo方法:然后把对象放入list:然后调用Collections.sort(list);b. 一种是不对要排序对象类做任何改动,创建Comparator接口的实现类C:然后 把对象放入list:然后调用Collections.sort(list, C); a.eg ---------------------------------- 1 public class User imple

对JSON数组对象排序-有键相同的元素,分组数量不一致,可采用如下的JS进行循环表格输出

var now=eval(data.data); // now.sort(sortBy('bigIdOrder', true, parseInt)); var tab=""; var k=0; var hangye=0; var index = 0; // alert(JSON.stringify(now[i])); for(var i=0;i<now.length;i++){ index++; if(now[i].bigId!=hangye){ if(i==0){ // 第一个

JAVA中Arrays.sort()使用两种方式(Comparable和Comparator接口)对对象或者引用进行排序

一.描述 自定义的类要按照一定的方式进行排序,比如一个Person类要按照年龄进行从小到大排序,比如一个Student类要按照成绩进行由高到低排序. 这里我们采用两种方式,一种是使用Comparable接口:让待排序对象所在的类实现Comparable接口,并重写Comparable接口中的compareTo()方法,缺点是只能按照一种规则排序. 另一种方式是使用Comparator接口:编写多个排序方式类实现Comparator接口,并重写新Comparator接口中的compare()方法,