Java 常用工具类--集合排序

集合排序

  • 使用Collections类的sort()方法
  • sort(List<T> list) 根据元素的自然顺序对指定列表按升序进行排序。
  • 通过Collections.sort中实现comparator 接口对自定义对象进行排序

对整形数据进行排序

package com.alan.sort;

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

public class IntSort {

    public static void main(String[] args) {
        // 对存储在List中对整形数据进行排序
        // 定义泛型只能为对象,这里对int使用相应的装箱对象Integer,输入整数时会自动装箱
        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.print(n+" ");
        }
        System.out.println();
        //使用Collections类对数据进行排序
        Collections.sort(list);
        System.out.println("排序后:");
        for(int n:list) {
            System.out.print(n+" ");
        }

    }

}

对字符串进行排序

package com.alan.sort;

import java.util.ArrayList;
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.print(s + " ");
        }
        System.out.println();
        Collections.sort(list);
        System.out.println("排序后:");
        for (String s : list) {
            System.out.print(s + " ");
        }

    }

}

Comparator接口介绍

  • 强行对某个对象进行整体排序的比较函数。
  • 可以将Comparaotr传递给sort方法

对自定义宠物猫类分别按名字升序、年龄降序进行排列

  • 首先定义宠物猫类
package com.alan.sort;

public class Cat {
    
    //属性:名字、年龄、品种
    private String name;
    private int month;
    private String species;
    
    //无参构造
    public Cat() {
        
    }
    //带参构造
    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;
    }
    
    //由于使用了HashSet这里重写ToString方法
    @Override
    public String toString() {
        return "[名字:" + name + ", 年龄:" + month + ", 品种:" + species +"]";
    }
}

  • 按名字排序重写Comparator中的compare方法
package com.alan.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);
        return n;
    }

}

  • 按年龄排序重写Comparator中的compare方法
package com.alan.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();
        //方法一:逻辑运算复杂
//      if (age1 > age2) {
//          return -1;
//      } else if (age1 < age2) {
//          return 1;
//      } else {
//          return 0;
//      }
        //方法二:
        return age2-age1;

    }

}

  • 排序实现主方法
package com.alan.sort;

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

public class CatSort {

    public static void main(String[] args) {
        // 对宠物猫对象进行排序
        Cat huahua = new Cat("huahua", 2, "英国短毛猫");
        Cat fanfan = new Cat("fanfan", 5, "中华田园猫");
        Cat maomao = new Cat("maomao", 3, "中华田园猫");
        // 通过ArrayList存放Cat对象
        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中的Comparatror接口的compara方法。对其进行排序
        Collections.sort(catList, new NameComparator());
        System.out.println("按名字升序排序后:");
        for (Cat cat : catList) {
            System.out.println(cat);
        }
        
        //调用AgeComparator类,实现按年龄降序排序
        System.out.println("按年龄降序排序前:");
        for (Cat cat : catList) {
            System.out.println(cat);
        }
        Collections.sort(catList, new AgeComparator());
        System.out.println("按年龄降序排序后:");
        for (Cat cat : catList) {
            System.out.println(cat);
        }
    }

}

Comparable接口

  • 此接口强行对实现它的每个类的对象进行整体排序。
  • 这种排序被称为类的自然排序,类的 compareTo 方法被称为它
    的自然比较方法。
  • 对于集合,通过调用Collections.sort方法进行排序。
  • 对于数组,通过调用Arrays.sort方法进行排序。
  • 定义要实现的类的同时就实现了Comparable接口

使用Comparable接口对商品价格进行降序排列

  • 定义商品类,同时重写Comparable接口中的compareTo方法
package com.alan.sort;

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() {
        return "商品编号:" + id + ", 商品名称:" + name + ", 商品价格:" + price;
    }
    @Override
    public int compareTo(Goods o) {
        // 对对象中对价格属性进行比较,降序排列
        double price1 = this.getPrice();
        double price2 = o.getPrice();
    //  int n = new Double(price2-price1).intValue();
        int n = (int) (price2-price1);
        return n;
    }
}

  • 主方法中实现按商品价格降序排序
package com.alan.sort;

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

public class GoodsTest {

    public static void main(String[] args) {
        // 对商品对价格进行降序排列
        Goods goods1 = new Goods("goods001","手机",888.88);
        Goods goods2 = new Goods("goods002","手表",588.88);
        Goods goods3 = new Goods("goods003","电脑",1888.88);
        
        //将商品存放到ArrayList中
        List<Goods> goodsList = new ArrayList<Goods>();
        goodsList.add(goods1);
        goodsList.add(goods2);
        goodsList.add(goods3);
        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);
        }
        

    }

}
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容