java-集合类(3)-实现比较器(Comparator)接口-LinkedList针对插入删除、开始处增加元素

Java集合:LinkedList与Comparator接口实现比较器
本文介绍如何在Java中实现Comparator接口,提供一个不依赖Comparable的比较器例子,特别关注在LinkedList中使用Comparator的情况。讲解了LinkedList与ArrayList的区别,强调如果频繁在列表开头添加、插入或删除元素,LinkedList更为适合。还提到了Collections.binarySearch()方法在已排序列表中的应用。

实现比较器(Comparator)接口
这里写图片描述
实现比较器例子:

package ArrayList;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

class ArrayListTest {

    public static void printElements(Collection<?> c) {
        Iterator<?> it = c.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }

    public static void main(String[] args) {
        Student s1 = new Student(5, "xiaoxi");
        Student s2 = new Student(2, "xiaohong");
        Student s3 = new Student(3, "xiaozhu");
        ArrayList<Student> al = new ArrayList<Student>();
        al.add(s1);
        al.add(s2);
        al.add(s3);
        // Collections类进行排序
        Collections.sort(al, new Student.StudentComparator());
        printElements(al);
    }
}

class Student /*implements Comparable<Object> */{
    int num;
    String name;
    //实现比较器(Comparator)接口。声明为static 好处是不用产生一个外部类对象再产生一个内部类对象而是直接用外部类名称来产生一个内部类对象
    static class StudentComparator implements Comparator<Student> {

        @Override
        public int compare(Student o1, Student o2) {
            return o1.num > o2.num ? 1 : (o1.num == o2.num ? 0 : -1);
        }
    }

    Student(int num, String name) {
        this.name = name;
        this.num = num;
    }

    /*@Override
    public int compareTo(Object arg0) {
        Student s = (Student) arg0;
        // 如果当前数比你要比较的数大返回1,小,返回负数
        return num > s.num ? 1 : (num == s.num ? 0 : -1);
    }*/
    //格式化输出格式
    public String toString() {
        return "num=" + num + ", name=" + name;
    }

}

不用上一节的继承Comparable方式
变式1:

package ArrayList;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

class ArrayListTest {

    public static void printElements(Collection<?> c) {
        Iterator<?> it = c.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }

    public static void main(String[] args) {
        Student s1 = new Student(5, "xiaoxi");
        Student s2 = new Student(2, "xiaohong");
        Student s3 = new Student(3, "xiaozhu");
        Student s4 = new Student(2, "miaoli");
        ArrayList<Student> al = new ArrayList<Student>();
        al.add(s1);
        al.add(s2);
        al.add(s3);
        al.add(s4);
        // Collections类进行排序,第二个参数是自定义比较器
        Collections.sort(al, new Student.StudentComparator());
        printElements(al);
    }
}

class Student /*implements Comparable<Object> */{
    int num;
    String name;
    //实现比较器(Comparator)接口。声明为static 好处是不用产生一个外部类对象再产生一个内部类对象而是直接用外部类名称来产生一个内部类对象
    static class StudentComparator implements Comparator<Student> {

        @Override
        public int compare(Student o1, Student o2) {
            int result = o1.num > o2.num ? 1 : (o1.num == o2.num ? 0 : -1);
            if(result == 0){
                //当我们要比较的学号有一样的,那么就比较名字
                result = o1.name.compareTo(o2.name);
            }
            return result;
        }
    }

    Student(int num, String name) {
        this.name = name;
        this.num = num;
    }

    /*@Override
    public int compareTo(Object arg0) {
        Student s = (Student) arg0;
        // 如果当前数比你要比较的数大返回1,小,返回负数
        return num > s.num ? 1 : (num == s.num ? 0 : -1);
    }*/
    //格式化输出格式
    public String toString() {
        return "num=" + num + ", name=" + name;
    }

}

学号重复比较名字,修改比较器
结果:

num=2, name=miaoli
num=2, name=xiaohong
num=3, name=xiaozhu
num=5, name=xiaoxi

已排序的List中搜索指定的元素:Collectons.binarySearch()。Collections 类主要针对列表操作,arrays类对数组操作


LinkedList
先引出数据结构:
ArrayList和LinkedList的比较
1、ArrayList底层采用数组完成,而LinkedList则是以一般的双向链表(double-linked list)完成,其内每个对象除了数据本身外,还有两个 引用,分别指向前一个元素和后一个元素。
2、如果我们经常在List的开始处增加元素,或者在List中进行插入和删除操作,我们应该使用LinkedList,否则的话,使用ArrayList将更加快速。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值