1. 程式人生 > 其它 >幾種排序的不同寫法 和 遍歷列表的另外形式

幾種排序的不同寫法 和 遍歷列表的另外形式

技術標籤:心得小記JAVA基礎lambdajava

話不多說,直接上程式碼。程式碼複製後可以直接跑,結果更清晰直觀。
需要Lombok外掛進行註解支援。

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/** * 幾種排序的不同寫法 和 遍歷列表的另外形式 * * @author amx * @date 2021/1/15 16:03 */ public class SortTest { /*Person列表物件*/ private static final List<Person> persons; /** * Person類 */ @Data @AllArgsConstructor @NoArgsConstructor private static class Person { private String name; private int age;
} /*初始化列表*/ static { persons = new ArrayList<>();//列表 persons.add(new Person("aaa", 12)); persons.add(new Person("ccc", 8)); persons.add(new Person("bbb", 20)); persons.add(new Person("abc", 15)); } // 遍歷 // /** 傳統遍歷 */ @Test public void test1
() { for (Person person : persons) { System.out.println(person.getName() + "---" + person.getAge()); } } /** list的方法遍歷 + lambda表示式 */ @Test public void test2() { persons.forEach(person -> System.out.println(person.getName() + "---" + person.getAge())); } /** list的方法遍歷 + 方法引用表示式 */ @Test public void test3() { persons.forEach(System.out::println); } // 排序 // /** Collections排序,重寫比較器方法 */ @Test public void test4() { System.out.println("Age排序前:"); persons.forEach(System.out::println); //Collections排序,按年齡升序 Collections.sort(persons, new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return o1.getAge() - o2.getAge(); } }); System.out.println("Age排序後:"); persons.forEach(System.out::println); } /** Collections排序,轉換為Lambda表示式的寫法 */ @Test public void test5() { System.out.println("Age排序前:"); persons.forEach(System.out::println); //Collections排序,按年齡升序 Collections.sort(persons, (o1, o2) -> o1.getAge() - o2.getAge()); System.out.println("Age排序後:"); persons.forEach(System.out::println); } /** Collections排序,轉換為Lambda表示式的寫法 */ @Test public void test6() { System.out.println("Age排序前:"); persons.forEach(System.out::println); //Collections排序,按年齡升序 Collections.sort(persons, Comparator.comparingInt(Person::getAge)); System.out.println("Age排序後:"); persons.forEach(System.out::println); } /** * 其實List本身也有sort排序方法 ,使用list的排序+年齡降序 * compareTo()之類的方法們預設是升序的,排序後使用reversed()進行翻轉,即可得降序 */ @Test public void test7() { System.out.println("Age排序前:"); persons.forEach(System.out::println); //Collections排序,按年齡降序 persons.sort(Comparator.comparingInt(Person::getAge).reversed()); System.out.println("Age降序排序後:"); persons.forEach(System.out::println); } /** 使用list的排序+name升序 */ @Test public void test8() { System.out.println("Name排序前:"); persons.forEach(System.out::println); //List排序,按名字升序 persons.sort(Comparator.comparing(Person::getName)); System.out.println("Name排序後:"); persons.forEach(System.out::println); } /** 使用list的排序+name升序 */ @Test public void test9() { System.out.println("Name排序前:"); persons.forEach(System.out::println); //List排序,按名字升序,降序可以兩種方法實現:① reversed方法;② 調換主動的物件:b.getName().compareTo(a.getName() persons.sort((a, b) -> a.getName().compareTo(b.getName())); System.out.println("Name排序後:"); persons.forEach(System.out::println); } /** 多條件排序,先按照年齡降序再按照名字升序,使用then字首的方法進行多條件比較 */ @Test public void test10() { persons.add(new Person("aaa", 99)); persons.add(new Person("ddd", 20)); System.out.println("多條件排序前:"); persons.forEach(System.out::println); //多條件排序,先按照年齡降序再按照名字升序 persons.sort(Comparator.comparingInt(Person::getAge).reversed() .thenComparing(Person::getName)); System.out.println("多條件排序後:"); persons.forEach(System.out::println); } }

寫媒資管理模組時需要對陣列進行轉換、排序、比較,於是查了下資料,寫了一點測試方法。
寫測試的過程中,對靜態內部類、靜態程式碼塊、靜態物件、匿名內部類等這些又複習了一遍,也算是把之前沒有用上的東西給用到了。
對λ表示式和方法引用表示式有了更深的體會,還發現了一些自己以前沒有用過的東西。
總結本次Demo的心得如下:

  1. 靜態內部類的使用

  2. 靜態內部類、靜態程式碼塊、靜態變數的載入順序:

    最先載入靜態變數(靜態程式碼塊要用到);
    然後載入靜態程式碼塊(靜態程式碼塊裡面新建了靜態內部類物件);
    載入靜態內部類物件。

  3. List.forEach()方法,可以做到更簡潔的遍歷list;

  4. Collections.sort() 方法和List物件的sort()方法,進行比較;

  5. 比較器Comparator的使用;

  6. λ表示式和方法引用表示式的使用;

  7. reversed()方法和thenComparing()的使用。