Java集合排序

集合排序概述

  • 集合中的基本数据类型排序
  • 集合中的字符串排序
  • Comparator接口
  • Comparable接口

  • 数组的排序
    //数组排序
    int[] arr = {15,31,23,46,65,12};
    Arrays.sort(arr);
  • 使用Collections类的sort()方法
  • sort(List list)
    根据元素的自然顺序对指定列表按升序进行排序。

对整型进行排序

package com.imooc.sort;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class IntSort {

    public static void main(String[] args) {
        // 对存储在List中的整型数据进行排序
        List<Integer> list = new ArrayList<Integer>();
        list.add(5);
        list.add(9);
        list.add(3);
        list.add(1);
        System.out.println("排序前:");
        for(int n : list) {
            System.out.println(n+ " ");
        }
        System.out.println();
        //对List中的数据进行排序
        Collections.sort(list);
        System.out.println("排序后:");
        for(int n:list) {
            System.out.println(n+ " ");
        }


    }
}

例题

例1:对存放在List中的整型数据进行排序。
例2:对存放在List中的字符串进行排序。

package com.imooc.sort;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

public class StringSort {

    public static void main(String[] args) {
        //对存放在List中的字符串进行排序
        List<String>  list = new ArrayList<String>();
        list.add("orange");
        list.add("blue");
        list.add("yellow");
        list.add("gray");
        System.out.println("排序前:");
        for(String s:list){
            System.out.println(s + " ");
        }
        System.out.println();
        Collections.sort(list);
        System.out.println("排序后:");
        for(String s:list){
            System.out.println(s + " ");
        }
    }
}

Comparator接口介绍

疑问: 宠物猫如何排序?
解决办法: 使用Comparable或Comparator接口

Comparator接口
  • 强行对某个对象进行整体排序的比较函数。
  • 可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort)

int compare(T o1, T o2) 比较用来排序的两个参数。

  • 如果o1<o2,返回负整数
  • 如果o1==o2,返回0
  • 如果o1>o2,返回正整数

  • boolean equals(Object obj) 指示某个其他对象是否 “等于” 此Comparator
  • 此方法可以被Object类中的equals方法覆盖,不必重写。

例:对宠物猫分别按名字升序、年龄降序进行排序。

先定义好Cat类
在这里插入图片描述

package com.imooc.sort;

public class Cat {
    private String name;//名字
    private int month;//年龄
    private String species;//品种

    public Cat(String name, int month, String species) {
        this.name = name;
        this.month = month;
        this.species = species;
    }

    public String getName() {
        return name;
    }

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

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public String getSpecies() {
        return species;
    }

    public void setSpecies(String species) {
        this.species = species;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("Cat{");
        sb.append("name='").append(name).append('\'');
        sb.append(", month=").append(month);
        sb.append(", species='").append(species).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

NameComparator

在这里插入代码片package com.imooc.sort;

import java.util.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);
        //降序排序就这样改
        // int n = name2.compareTo(name1);
        return n;
    }
}

CatTest

package com.imooc.sort;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CatTest {
    public static void main(String[] args){
        //按名字升序排序
        Cat huahua = new Cat("huahua",5,"英国短毛猫");
        Cat fanfan = new Cat("huahua", 2,"中华田园猫");
        Cat maomao = new Cat("maomao", 3 ,"中华田园猫");
        List<Cat> catList = new ArrayList<Cat>();
        catList.add(huahua);
        catList.add(fanfan);
        catList.add(maomao);
        //排序前
        System.out.println("按名字排序前:");
        for(Cat cat:catList){
            System.out.println(cat);
        }
        //按名字进行升序排序
        Collections.sort(catList, new NameComparator());
        System.out.println("按名字排序后:");
        for(Cat cat:catList){
            System.out.println(cat);
        }
    }
}


案例:对宠物猫按年龄降序排序

AgeComparator

package com.imooc.sort;

import java.util.Comparator;

public class AgeComparator implements Comparator<Cat> {
    @Override
    public int compare(Cat o1, Cat o2) {
        //按年龄降序排序
        int age1 = o1.getMonth();
        int age2 = o2.getMonth();
        return age2-age1;
    }
}

使用

        //按年龄进行降序排序
        Collections.sort(catList, new AgeComparator());
        System.out.println("按年龄降序排序后:");
        for (Cat cat:catList){
            System.out.println(cat);
        }

Comparable接口

  • 此接口强行对实现它的每个类的对象进行整体排序
  • 这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
  • 对于集合,通过调用Collections.sort方法进行排序。
  • 对于数组,通过调用Arrays.sort方法进行排序。
  • int compareTo(T o)方法
  • 该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
  • 例:对商品价格进行降序排序。

Goods

package com.imooc.sort;

import java.util.Comparator;

public class Goods implements Comparable<Goods> {

    private String id;//商品编号
    private String name;//商品名称
    private double price;//商品价格

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

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("Goods{");
        sb.append("id='").append(id).append('\'');
        sb.append(", name='").append(name).append('\'');
        sb.append(", price=").append(price);
        sb.append('}');
        return sb.toString();
    }



    @Override
    public int compareTo(Goods o) {
        //取出商品价格
        double price1 = this.getPrice();
        double price2 = o.getPrice();
        int n = new Double (price2-price1).intValue();

        return n;
    }
}

GoodsTest

package com.imooc.sort;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class GoodsTest {

    public static void main(String[] args){
        Goods g1 = new Goods("s00001","s",2000);
        Goods g2 = new Goods("s00002","冰箱",5000);
        Goods g3 = new Goods("s00003","电视机",3000);
        List<Goods> goodsList = new ArrayList<Goods>();
        goodsList.add(g1);
        goodsList.add(g2);
        goodsList.add(g3);
        //排序前
        System.out.println("排序前:");
        for(Goods goods:goodsList){
            System.out.println(goods);
        }

        Collections.sort(goodsList);
        //排序前
        System.out.println("排序后:");
        for(Goods goods:goodsList){
            System.out.println(goods);
        }


    }
}

Comparator和Comparable的区别

在这里插入图片描述

Comparator

  1. 实现要比较的类
  2. 实现Comparator接口
  3. 测试

Comparable

  1. 定义要比较的类,并实现Comparable接口
  2. 测试
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值