Java 8 如何使用 stream.sorted() 对 Set 进行排序

x33g5p2x  于2021-10-16 转载在 Java  
字(6.2k)|赞(0)|评价(0)|浏览(1700)

在这个快速教程中,我们将学习如何在 Java 8 中对 Set 进行排序。 stream.sorted()Stream 接口的预定义方法,用于对 Set 或任何 Collection 实现的类。

Set 的元素进行排序类似于列表的排序。

1. 自然/默认排序顺序

在这里,我们有一个 Set 的员工,并且集合的类型是 String

package org.websparrow.sorting;

import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;

public class SetSorting {

	public static void main(String[] args) {

		Set<String> employees = new HashSet<>();
		employees.add("Sunny Tiwari");
		employees.add("Ashutosh Pandey");
		employees.add("Vipin Singh");
		employees.add("Mintoo Prasad");

		System.out.println("--- Set before sorted ---");
		employees.forEach(System.out::println);

		System.out.println("--- Set after sorted ---");
		employees.stream().sorted().forEach(System.out::println);
	}
}

输出

--- Set before sorted ---
Vipin Singh
Ashutosh Pandey
Mintoo Prasad
Sunny Tiwari
--- Set after sorted ---
Ashutosh Pandey
Mintoo Prasad
Sunny Tiwari
Vipin Singh

或者,我们也可以在重载的 sorted() 方法中将 Comparator.naturalOrder() 作为参数传递,即 sorted(Comparator.naturalOrder()) 给出相同的输出。

employees
		.stream()
		.sorted(Comparator.naturalOrder())
		.forEach(System.out::println);

类似地,我们也可以通过调用 compareTo(String *object*) 方法来一一比较元素,就像我们在旧版本的 Java 中所做的那样。它也产生相同的输出。

employees
		.stream()
		.sorted((o1, o2) -> o1.compareTo(o2))
		.forEach(System.out::println);

2. 逆序排序

Set 元素可以通过传递 Comparator.naturalOrder() 以倒序排序。它返回一个比较器,该比较器强加了自然顺序的相反。

package org.websparrow.sorting;

import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;

public class SetSortingReverseOrder {

	public static void main(String[] args) {

		Set<String> set = new HashSet<>();
		set.add("Sunny Tiwari");
		set.add("Ashutosh Pandey");
		set.add("Vipin Singh");
		set.add("Mintoo Prasad");

		System.out.println("--- Set before sorted ---");
		set.forEach(System.out::println);

		System.out.println("--- Set after sorted (Reverse order) ---");
		set.stream().sorted(Comparator.reverseOrder())
				.forEach(System.out::println);

		System.out.println("--- Set after sorted (Reverse order) Old days ---");
		set.stream().sorted((o1, o2) -> o2.compareTo(o1))
				.forEach(System.out::println);
	}
}

输出

--- Set before sorted ---
Vipin Singh
Ashutosh Pandey
Mintoo Prasad
Sunny Tiwari
--- Set after sorted (Reverse order) ---
Vipin Singh
Sunny Tiwari
Mintoo Prasad
Ashutosh Pandey
--- Set after sorted (Reverse order) Old days ---
Vipin Singh
Sunny Tiwari
Mintoo Prasad
Ashutosh Pandey

3. 自定义对象的排序集

我们还可以使用 stream.sorted() 方法对自定义对象 Set 进行排序。让我们有 Car 类以及它的属性,如 id、品牌名称、型号年份等。

package org.websparrow.sorting;

public class Car {

	// Generate Getters and Setters...
	private int id;
	private String brand;
	private int modelYear;

	public Car(int id, String brand, int modelYear) {
		this.id = id;
		this.brand = brand;
		this.modelYear = modelYear;
	}

	@Override
	public String toString() {
		return "Car [id=" + id + ", brand=" + brand + ", modelYear=" + modelYear
				+ "]";
	}
}

3.1 按 id 排序(自然/默认排序顺序)

package org.websparrow.sorting;

import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;

public class SetSortingCustomObject {

	public static void main(String[] args) {

		Set<Car> set = new HashSet<>();
		set.add(new Car(166, "Tata", 1967));
		set.add(new Car(112, "Mahindra", 1978));
		set.add(new Car(66, "Hindustan Motors", 1950));
		set.add(new Car(203, "BMW", 1998));

		System.out.println("--- Cars before sorted ---");
		set.forEach(System.out::println);

		System.out.println("--- Cars after sorted ---");
		set.stream().sorted(Comparator.comparingInt(Car::getId))
				.forEach(System.out::println);

		System.out.println("--- Cars after sorted (Old days) ---");
		set.stream().sorted((o1, o2) -> o1.getId() - o2.getId())
				.forEach(System.out::println);
	}
}

输出

--- Cars before sorted ---
Car [id=166, brand=Tata, modelYear=1967]
Car [id=112, brand=Mahindra, modelYear=1978]
Car [id=66, brand=Hindustan Motors, modelYear=1950]
Car [id=203, brand=BMW, modelYear=1998]
--- Cars after sorted ---
Car [id=66, brand=Hindustan Motors, modelYear=1950]
Car [id=112, brand=Mahindra, modelYear=1978]
Car [id=166, brand=Tata, modelYear=1967]
Car [id=203, brand=BMW, modelYear=1998]
--- Cars after sorted (Old days) ---
Car [id=66, brand=Hindustan Motors, modelYear=1950]
Car [id=112, brand=Mahindra, modelYear=1978]
Car [id=166, brand=Tata, modelYear=1967]
Car [id=203, brand=BMW, modelYear=1998]

3.2 按 id 排序(逆序)

Comparatorreversed() 方法用于尊重已排序 Set 的元素。

package org.websparrow.sorting;

import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;

public class SetSortingCustomObject {

	public static void main(String[] args) {

		Set<Car> set = new HashSet<>();
		set.add(new Car(166, "Tata", 1967));
		set.add(new Car(112, "Mahindra", 1978));
		set.add(new Car(66, "Hindustan Motors", 1950));
		set.add(new Car(203, "BMW", 1998));

		System.out.println("--- Cars before sorted ---");
		set.forEach(System.out::println);

		System.out.println("--- Cars after sorted (Reverse order)---");
		set.stream().sorted(Comparator.comparingInt(Car::getId).reversed())
				.forEach(System.out::println);

		System.out.println("--- Cars after sorted (Reverse order) Old days ---");
		set.stream().sorted((o1, o2) -> o2.getId() - o1.getId())
				.forEach(System.out::println);
	}
}

输出

--- Cars before sorted ---
Car [id=166, brand=Tata, modelYear=1967]
Car [id=112, brand=Mahindra, modelYear=1978]
Car [id=66, brand=Hindustan Motors, modelYear=1950]
Car [id=203, brand=BMW, modelYear=1998]
--- Cars after sorted (Reverse order)---
Car [id=203, brand=BMW, modelYear=1998]
Car [id=166, brand=Tata, modelYear=1967]
Car [id=112, brand=Mahindra, modelYear=1978]
Car [id=66, brand=Hindustan Motors, modelYear=1950]
--- Cars after sorted (Reverse order) Old days ---
Car [id=203, brand=BMW, modelYear=1998]
Car [id=166, brand=Tata, modelYear=1967]
Car [id=112, brand=Mahindra, modelYear=1978]
Car [id=66, brand=Hindustan Motors, modelYear=1950]

3.3 按品牌排序

同样,我们也可以按 Carbrand 名称对其进行排序。

System.out.println("--- Cars after sorted ---");
set.stream().sorted(Comparator.comparing(Car::getBrand))
			.forEach(System.out::println);

System.out.println("--- Cars after sorted Old days ---");
set.stream().sorted((o1, o2) -> o1.getBrand().compareTo(o2.getBrand()))
			.forEach(System.out::println);

3.4 按品牌排序(逆序)

System.out.println("--- Cars after sorted (Reverse order)---");
set.stream().sorted(Comparator.comparing(Car::getBrand).reversed())
			.forEach(System.out::println);

System.out.println("--- Cars after sorted (Reverse order) Old days ---");
set.stream().sorted((o1, o2) -> o2.getBrand().compareTo(o1.getBrand()))
			.forEach(System.out::println);

相关文章