集合排序
- 使用Collections類的sort()方法
- sort(List<T> list) 根據(jù)元素的自然順序?qū)χ付斜戆瓷蜻M(jìn)行排序。
- 通過Collections.sort中實(shí)現(xiàn)comparator 接口對(duì)自定義對(duì)象進(jìn)行排序
對(duì)整形數(shù)據(jù)進(jìn)行排序
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) {
// 對(duì)存儲(chǔ)在List中對(duì)整形數(shù)據(jù)進(jìn)行排序
// 定義泛型只能為對(duì)象,這里對(duì)int使用相應(yīng)的裝箱對(duì)象Integer,輸入整數(shù)時(shí)會(huì)自動(dòng)裝箱
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類對(duì)數(shù)據(jù)進(jìn)行排序
Collections.sort(list);
System.out.println("排序后:");
for(int n:list) {
System.out.print(n+" ");
}
}
}
對(duì)字符串進(jì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) {
// 對(duì)存放在List中的字符串進(jìn)行排序
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接口介紹
- 強(qiáng)行對(duì)某個(gè)對(duì)象進(jìn)行整體排序的比較函數(shù)。
- 可以將Comparaotr傳遞給sort方法
對(duì)自定義寵物貓類分別按名字升序、年齡降序進(jìn)行排列
- 首先定義寵物貓類
package com.alan.sort;
public class Cat {
//屬性:名字、年齡、品種
private String name;
private int month;
private String species;
//無(wú)參構(gòu)造
public Cat() {
}
//帶參構(gòu)造
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) {
// 按照名字升序進(jìn)行排序
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) {
// 按照寵物貓的年齡進(jìn)行降序排序
int age1 = o1.getMonth();
int age2 = o2.getMonth();
//方法一:邏輯運(yùn)算復(fù)雜
// if (age1 > age2) {
// return -1;
// } else if (age1 < age2) {
// return 1;
// } else {
// return 0;
// }
//方法二:
return age2-age1;
}
}
- 排序?qū)崿F(xiàn)主方法
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) {
// 對(duì)寵物貓對(duì)象進(jìn)行排序
Cat huahua = new Cat("huahua", 2, "英國(guó)短毛貓");
Cat fanfan = new Cat("fanfan", 5, "中華田園貓");
Cat maomao = new Cat("maomao", 3, "中華田園貓");
// 通過ArrayList存放Cat對(duì)象
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方法。對(duì)其進(jìn)行排序
Collections.sort(catList, new NameComparator());
System.out.println("按名字升序排序后:");
for (Cat cat : catList) {
System.out.println(cat);
}
//調(diào)用AgeComparator類,實(shí)現(xiàn)按年齡降序排序
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接口
- 此接口強(qiáng)行對(duì)實(shí)現(xiàn)它的每個(gè)類的對(duì)象進(jìn)行整體排序。
- 這種排序被稱為類的自然排序,類的 compareTo 方法被稱為它
的自然比較方法。 - 對(duì)于集合,通過調(diào)用Collections.sort方法進(jìn)行排序。
- 對(duì)于數(shù)組,通過調(diào)用Arrays.sort方法進(jìn)行排序。
- 定義要實(shí)現(xiàn)的類的同時(shí)就實(shí)現(xiàn)了Comparable接口
使用Comparable接口對(duì)商品價(jià)格進(jìn)行降序排列
- 定義商品類,同時(shí)重寫Comparable接口中的compareTo方法
package com.alan.sort;
public class Goods implements Comparable<Goods> {
//屬性:商品編號(hào)、商品名稱、商品價(jià)格
private String id;
private String name;
private double price;
//帶參構(gòu)造
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 "商品編號(hào):" + id + ", 商品名稱:" + name + ", 商品價(jià)格:" + price;
}
@Override
public int compareTo(Goods o) {
// 對(duì)對(duì)象中對(duì)價(jià)格屬性進(jìn)行比較,降序排列
double price1 = this.getPrice();
double price2 = o.getPrice();
// int n = new Double(price2-price1).intValue();
int n = (int) (price2-price1);
return n;
}
}
- 主方法中實(shí)現(xiàn)按商品價(jià)格降序排序
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) {
// 對(duì)商品對(duì)價(jià)格進(jìn)行降序排列
Goods goods1 = new Goods("goods001","手機(jī)",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("商品按價(jià)格排序前:");
for(Goods goods:goodsList ) {
System.out.println(goods);
}
Collections.sort(goodsList);
System.out.println("商品按價(jià)格排序后:");
for(Goods goods:goodsList ) {
System.out.println(goods);
}
}
}

image.png