+3

Sắp xếp Collection trong Java

1. Đối với array:

Để sort một array, chúng ta có thể dùng method sort trong gói java.util.Arrays Ví dụ:

int [] array = new int[]{1, 2, 4, 1, 3, 5, 7, 6};
Arrays.sort(array);
for (int x : array) {
   System.out.println(x);
}

Kết quả:

1
1
2
3
4
5
6
7

Gói Java.util.Arrays còn hỗ trợ 1 số phương thức sort khác như sau:

static void	sort(byte[] a)
static void	sort(byte[] a, int fromIndex, int toIndex)
static void	sort(char[] a)
static void	sort(char[] a, int fromIndex, int toIndex)
static void	sort(double[] a)
static void	sort(double[] a, int fromIndex, int toIndex)
static void	sort(float[] a)
static void	sort(float[] a, int fromIndex, int toIndex)
static void	sort(int[] a)
static void	sort(int[] a, int fromIndex, int toIndex)
static void	sort(long[] a)
static void	sort(long[] a, int fromIndex, int toIndex)
static void	sort(Object[] a)
static void	sort(Object[] a, int fromIndex, int toIndex)
static void	sort(short[] a)
static void	sort(short[] a, int fromIndex, int toIndex)
static <T> void	sort(T[] a, Comparator<? super T> c)
static <T> void	sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c)

2. Đối với List

List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 4, 1, 3, 5, 7, 6));
        Collections.sort(list);
        list.forEach(e -> System.out.println(e));

Kết quả:

1
1
2
3
4
5
6
7

3. Sắp xếp list objects sử dụng Comparator

Trước hết, chúng ta tạo class Student như sau:

public class Student  {

    private String name;
    private int age;

    public Student() {

    }

    public Student(String name,int age ) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

3.1 Implement interface Comparator<T>

Interface Comparable<T> cung cấp một phương thức để sắp xếp list object là int compare(T o1, T o2). Việc chúng ta chỉ là implement interface này.

public class Student implements Comparator<Student> {
    // Các method và field như ở trên
    @Override
    public int compare(Student o1, Student o2) {
        return o1.getAge() - o2.getAge();
    }
}

Và gọi java.util.Collections.sort để sắp xếp.

List<Student> students = new ArrayList<>();
students.add(new Student("Jonh", 17));
students.add(new Student("Peter", 19));
students.add(new Student("Henry", 18));
java.util.Collections.sort(students, new Student());
students.forEach(e -> System.out.println(e));

Kết quả:

Student{name='Jonh', age=17}
Student{name='Henry', age=18}
Student{name='Peter', age=19}

##3.2 Sử dụng anonymous comparator để so sánh Thay vì implement trực tiếp từ interface Comparator<T>, chúng ta có thể sử dụng anonymous comparator như sau:

 List<Student> students = new ArrayList<>();
        students.add(new Student("Jonh", 17));
        students.add(new Student("Peter", 19));
        students.add(new Student("Henry", 18));
        Collections.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getAge() - o2.getAge();
            }
        });

        students.forEach(e -> System.out.println(e));

Kết quả vẫn không đổi:

Student{name='Jonh', age=17}
Student{name='Henry', age=18}
Student{name='Peter', age=19}

4. Sắp xếp list objects sử dụng Comparable<T>

Vẫn sử dụng class Student ở trên, nhưng chúng ta sẽ implements interface Comparable<Student> và override lại method compareTo(Student o)

@Override
    public int compareTo(Student o) {
        return this.getAge() - o.getAge();
    }
List<Student> students = new ArrayList<>();
students.add(new Student("Jonh", 17));
students.add(new Student("Peter", 19));
students.add(new Student("Henry", 18));
Collections.sort(students);

students.forEach(e -> System.out.println(e));

Kết quả:

Student{name='Jonh', age=17}
Student{name='Henry', age=18}
Student{name='Peter', age=19}

Tham khảo: https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí