阶段一/常用工具类/集合排序

目录

关于comparTo方法

基本数据类型以integer为例

Stirng 的compareTo( )方法

Comparator接口

Comparable接口

Comparable VS Comparator

TreeSet


关于comparTo方法

基本数据类型的包装类和字符串都有comparTo方法,直接调用即可。

基本数据类型以integer为例

public int compateTo(Integer anotherInteger)

对于返回值,如果调用compareTo( )方法的对象等于参数,返回零,
如果大于参数,则返回一个大于0的值;如果小于参数,则返回一个小于 0 的值。

Stirng 的compareTo( )方法

public int compateTo(String anotherString)

这个方法是按字典顺序比较两个字符串,比较的是字符串中每个字符的unicode值。
对于返回值,如果两个字符串相等,则返回0;如果字符串对象比参数小,则返回一个小于0的数;如果字符串对象比参数大,则返回一个大于0的数。
对于大于和小于的情况,可以看到返回结果不都是“-1”和“1”,而是不同的值,这时它们之间比较时,unicode值进行减法运算的结果。

Comparator接口

  • 强行对某个对象进行整体排序的比较函数
  • 可以将Comparator传递给sort方法,(如Collections.sort或Arrays.sort)
  • int compare(T o1, T o2)比较用来排序的两个参数,其比较规则类似compareTo方法
    • 若o1 < o2,返回负整数
    • 若o1 == o2,返回0
    • 若o1 > o2,返回正整数
  • 一个类实现Comparator接口,必须重写compare方法
  • boolean equals(Object obj)该方法可以被Object类中的equals方法覆盖,不必重写
  • sort()方法的第一个参数为要排序的集合对象。第二个参数为实现了Comparator接口的对象
public class NameComparator implements Comparator<Cat> {

    @Override
    public int compare(Cat o1, Cat o2) {
        // 按名字升序
        String name1 = o1.getName();
        String name2 = o2.getName();
        int n = name1.compareTo(name2); // name升序
//        int n = name2.compareTo(name1); // name降序
        return n;
    }
}
public class CatTest {
    public static void main(String[] args){
        Cat huahua = new Cat("huahua", 5, "英短");
        Cat fanfan = new Cat("fanfan", 2, "中华田园猫");
        Cat maomao = new Cat("maomao", 3, "中华田园猫");
        List<Cat> list = new ArrayList<Cat>();
        list.add(huahua);
        list.add(fanfan);
        list.add(maomao);
        System.out.println("排序前:");
        for(Cat cat: list){
            System.out.println(cat);
        }
        System.out.println();
        // 按名字升序, 我们已经定义了按名字升序排序的比较器,只需传入其对象就可以了
        // sort()方法的第一个参数为要排序的集合对象。第二个参数为实现了Comparator接口的对象
        Collections.sort(list, new NameComparator());
        System.out.println("按名字升序排序后:");
        for(Cat cat: list){
            System.out.println(cat);
        }
    }
}

 

Comparable接口

  • 此接口强行实行对实现它的每个类的对象进行整体排序
  • 这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法
  • 对于集合,通过调用Collections.sort方法进行排序
  • 对于数组,通过调用Arrays.sort方法进行排序
  • 一个类实现Comparator接口,必须重写compareTo方法
  • sort()方法直接传入带排序的对象,要求该对象所在的类必须实现了Comparable接口
public class Goods implements Comparable<Goods>{
    private String id;
    private double price;

    public Goods() {
    }

    public Goods(String id, double price) {
        this.id = id;
        this.price = price;
    }

    public double getPrice() {
        return price;
    }

    @Override
    public String toString() {
        return "商品编号:'" + id + '\'' +
                ", 商品价格:" + price;
    }

    @Override
    public int compareTo(Goods o) {
        double price1 = getPrice();
        double price2 = o.getPrice();
//        int n = new Double(price2 - price1).intValue(); // 不严谨
        double diff = price2 - price1;
        if(diff > 0)
            return 1;
        else if(diff == 0)
            return 0;
        else
            return -1;
    }
}
public class GoodsTest {
    public static void main(String[] args){
        Goods g1 = new Goods("s0001",  2000);
        Goods g2 = new Goods("s0002", 5000);
        Goods g3 = new Goods("s0003",  3000);

        List<Goods> goodsList = new ArrayList<Goods>();
        goodsList.add(g1);
        goodsList.add(g2);
        goodsList.add(g3);
        System.out.println("排序前:");
        for(Goods good: goodsList){
            System.out.println(good);
        }
        Collections.sort(goodsList);
        System.out.println("价格降序排序后:");
        for(Goods good: goodsList){
            System.out.println(good);
        }
    }
}

 

Comparable VS Comparator

Comparable和 Comparator都是java.util包下的两个接口,这两个接口都是用来实现排序,

区别:

  • 实现了Comparable的意思是我可以把自己和另一个对象进行比较;而实现了Comparator的意思是我可以比较其他两个对象;也就是说Comparable是一个可比较的对象可以将自己与另一个对象进行比较;而Comparator是比较两个不同的对象。
  • 使用Comparable需要修改原先的实体类,是属于一种自然排序。而Comparator则不用修改原先类。
  • 即使修改了Comparable实体类,Comparable也仅有一种比较规则。而Comparator可以实现多个,来提供多个比较规则。
  • 在使用时,一般Comparable接口可以作为实现类的默认排序算法,Comparator接口则用于一个类的扩展排序
  • Comparable调用sort方法时,只需指定集合名即可;Comparator调用sort方法时,要指定Comparator的实现类。

TreeSet

使用TreeSet对String类型的数据进行存储,存储顺序默认按字母升序排序。

  • 对象.first()           --》获取集合中的第一元素
  • 对象.last()           --》获取集合中的最后一个元素

使用TreeSet对Integer类型数据进行存储,存储顺序默认按数字从小到大排序。

  • floor()                  --》获取集合中小于等于给定元素的最大值,并输出,如果没有此元素返回null。
  • higher()               --》获取集合中大于等于给定元素的最小值,并输出,如果没有此元素返回null。

当TreeSet中添加自定义类的对象时,需要实现Comparable或Comparator接口指定属性,和升降序顺序,来完成排序。以Comparator为例:
注意:创建TreeSet对象时,要指定Comparator接口的实现类作为参数。

TreeSet<Person> personSet=new TreeSet<>(new PersonComparator());

 

  • pollFirst()             --》返回并删除集合中第一元素
  • pollLast()             --》返回并删除集合中最后一个元素,若集合为空,则返回null。

 

 

参考:慕课网-Java工程师

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值