幾種排序的不同寫法 和 遍歷列表的另外形式
阿新 • • 發佈:2021-01-16
話不多說,直接上程式碼。程式碼複製後可以直接跑,結果更清晰直觀。
需要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的心得如下:
-
靜態內部類的使用
-
靜態內部類、靜態程式碼塊、靜態變數的載入順序:
最先載入靜態變數(靜態程式碼塊要用到);
然後載入靜態程式碼塊(靜態程式碼塊裡面新建了靜態內部類物件);
載入靜態內部類物件。 -
List.forEach()
方法,可以做到更簡潔的遍歷list; -
Collections.sort()
方法和List物件的sort()
方法,進行比較; -
比較器
Comparator
的使用; -
λ表示式和方法引用表示式的使用;
-
reversed()
方法和thenComparing()
的使用。