Sort LinkedList với Stream API

Sắp xếp là một trong những thao tác thường xuyên trong lúc code. Java đã xây dựng sẵn các hàm sắp xếp có trong LinkedList và Collections. Ở bài này, chúng ta sẽ tiếp cận nó với một cách mới mang tên stream api.

Stream api được giới thiệu trong java 8, hỗ trợ mạnh mẽ cho chúng ta việc viết code. Gồm nhiều tính năng như filter, sort, reduce etc. Sau đây chúng ta sẽ tìm hiểu chi tiết về sắp xếp LinkedList với stream api.

syntax:

public final Stream<P_OUT> sorted(Comparator<? super P_OUT> comparator)

Sort LinkedList tăng dần với stream api

Stream cung cấp cho chúng ta method sort() trong đường ống của nó. 

Ví dụ 1: Sắp xếp một LinkedList số nguyên tăng dần và xuất các phần tử ra màn hình console.

// File Main.java
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {

        LinkedList<Integer> linkedList = new LinkedList<>();
        linkedList.add(1);
        linkedList.add(-1);
        linkedList.add(99);
        linkedList.add(23);
        linkedList.add(10);
        linkedList.add(5);
        linkedList.add(4);
        linkedList.add(7);
        linkedList.add(8);
        List<Integer> sortArr= linkedList.stream()
                .sorted((o1, o2) -> o1 - o2)
                .collect(Collectors.toList());
        sortArr.forEach(t -> System.out.printf(t + " "));
    }
}

Output: -1 1 4 5 7 8 10 23 99

Ví dụ 2: Cho một LinkedList chứa danh sách các nhân viên gồm các thông tin sau: tên, tuổi, lương. Sắp xếp LinkedList tăng dần theo tuổi.

// File Staff.java
public class Staff {
    private String name;
    private double salary;
    private int age;

    public Staff(String name, double salary, int age) {
        this.name = name;
        this.salary = salary;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public double getSalary() {
        return salary;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Staff{" +
                "name='" + name + '\'' +
                ", salary=" + salary +
                ", age=" + age +
                '}';
    }
}
// File Main.java

import java_regex.Staff;

import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {

        LinkedList<Staff> linkedList = new LinkedList<>();
        linkedList.add(new Staff("H", 10000000, 20));
        linkedList.add(new Staff("B", 25000000, 21));
        linkedList.add(new Staff("F", 20000000, 30));
        linkedList.add(new Staff("K", 15000000, 27));
        linkedList.add(new Staff("I", 10000000, 21));
        linkedList.add(new Staff("P", 10000000, 21));

        System.out.println("Cach 1");
        List<Staff> list1 = linkedList.stream().sorted((s1, s2) -> s1.getAge() - s2.getAge())
                .collect(Collectors.toList());
        list1.forEach(s -> System.out.println(s.toString()));

        System.out.println("Cach 2");
        List<Staff> list2 = linkedList.stream().sorted(Comparator.comparingInt(Staff::getAge))
                .collect(Collectors.toList());
        list2.forEach(s -> System.out.println(s.toString()));
    }
}

Output:

Cach 1
Staff{name=’H’, salary=1.0E7, age=20}
Staff{name=’B’, salary=2.5E7, age=21}
Staff{name=’I’, salary=1.0E7, age=21}
Staff{name=’P’, salary=1.0E7, age=21}
Staff{name=’K’, salary=1.5E7, age=27}
Staff{name=’F’, salary=2.0E7, age=30}
Cach 2
Staff{name=’H’, salary=1.0E7, age=20}
Staff{name=’B’, salary=2.5E7, age=21}
Staff{name=’I’, salary=1.0E7, age=21}
Staff{name=’P’, salary=1.0E7, age=21}
Staff{name=’K’, salary=1.5E7, age=27}
Staff{name=’F’, salary=2.0E7, age=30}

Sort LinkedList giảm dần với streap api

Ví dụ: Cho một LinkedList chứa danh sách các nhân viên gồm các thông tin sau: tên, tuổi, lương. Sắp xếp LinkedList giảm dần theo lương.

import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {

        LinkedList<Staff> linkedList = new LinkedList<>();
        linkedList.add(new Staff("H", 10000000, 20));
        linkedList.add(new Staff("B", 25000000, 21));
        linkedList.add(new Staff("F", 20000000, 30));
        linkedList.add(new Staff("K", 15000000, 27));
        linkedList.add(new Staff("I", 10000000, 21));
        linkedList.add(new Staff("P", 10000000, 21));

        System.out.println("Cach 1");
        List<Staff> list1 = linkedList.stream().sorted(Comparator.comparingDouble(Staff::getSalary).reversed())
                .collect(Collectors.toList());
        list1.forEach(s -> System.out.println(s.toString()));

        System.out.println("Cach 2");
        List<Staff> list2 = linkedList.stream().sorted((s1, s2) -> Double.compare(s1.getSalary(), s2.getSalary()))
                .collect(Collectors.toList());
        list2.forEach(s -> System.out.println(s.toString()));

    }
}

Output:

Cach 1
Staff{name=’B’, salary=2.5E7, age=21}
Staff{name=’F’, salary=2.0E7, age=30}
Staff{name=’K’, salary=1.5E7, age=27}
Staff{name=’H’, salary=1.0E7, age=20}
Staff{name=’I’, salary=1.0E7, age=21}
Staff{name=’P’, salary=1.0E7, age=21}
Cach 2
Staff{name=’H’, salary=1.0E7, age=20}
Staff{name=’I’, salary=1.0E7, age=21}
Staff{name=’P’, salary=1.0E7, age=21}
Staff{name=’K’, salary=1.5E7, age=27}
Staff{name=’F’, salary=2.0E7, age=30}
Staff{name=’B’, salary=2.5E7, age=21}

Sort LinkedList theo nhiều thuộc tính

Sắp xếp tăng dần các Staff theo mức lương, nếu cùng mức lương tiến hàng sắp xếp theo tuổi

import java_regex.Staff;

import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {

        LinkedList<Staff> linkedList = new LinkedList<>();
        linkedList.add(new Staff("H", 10000000, 20));
        linkedList.add(new Staff("B", 25000000, 21));
        linkedList.add(new Staff("F", 20000000, 30));
        linkedList.add(new Staff("K", 15000000, 27));
        linkedList.add(new Staff("I", 10000000, 21));
        linkedList.add(new Staff("P", 10000000, 21));

        List<Staff> list = linkedList.stream().sorted(Comparator.comparing(Staff::getSalary).thenComparing(Staff::getAge))
                .collect(Collectors.toList());
        list.forEach(s -> System.out.println(s.toString()));
    }
}

Output:

Staff{name=’H’, salary=1.0E7, age=20}
Staff{name=’I’, salary=1.0E7, age=21}
Staff{name=’P’, salary=1.0E7, age=21}
Staff{name=’K’, salary=1.5E7, age=27}
Staff{name=’F’, salary=2.0E7, age=30}
Staff{name=’B’, salary=2.5E7, age=21}

‹Previous Next›

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x