Sắp xếp bất kì danh sách nào, với cách sắp xếp được định nghĩa sẵn

Em muốn tạo 1 phương thức có thể sắp xếp danh sách sinh viên, danh sách môn học theo tên
Đầu tiền là em làm theo cách là sử dụng hàm sort và Comparator, nhưng mà nó khá dài.

Khi muốn sắp xếp danh sách Sinh viên theo tên thì em phải viết 1 Comparator. Khi muốn sắp xếp danh sách môn học theo tên thì em lại phải viết một 1 Comparator mới tương tự.

Nên em muốn tạo 1 phương thức sắp xếp bất kì danh sách nào theo tên hoặc 1 tiêu chí khác.

Dưới đây là cách em làm. Nhưng mà hàm sortByName thì bị gạch chân vàng ở dưới code

Em có nên làm cách này không ạ và tại sao lại có gạch vàng ở dưới code và cách fix nó ạ.
Mong mọi người giúp đỡ em với ạ.
Em cảm ơn ạ.

Class Student và Subject em có implements Interface ISort. Để triển khai hàm getName() trong ISort


image

Đây là lỗi chỗ bóng đèn ạ:

Multiple markers at this line
	- List is a raw type. References to generic type List<E> should be 
	 parameterized
	- List is a raw type. References to generic type List<E> should be 
	 parameterized

Multiple markers at this line
	- Type safety: The expression of type List needs unchecked conversion to conform to List<ISort>
	- Type safety: Unchecked invocation sort(List, new Comparator<ISort>(){}) of the generic method sort(List<T>, Comparator<? super T>) of type 
	 Collections

Bạn cấp tham số kiểu (generic type parameter) cho List.
Như này:

public List<ISort> SortByName(List<ISort> list)

Chưa biết thì Google.

1 Like

Nếu mà đối số là một List < ISort > thì phải truyền vào là 1 danh sách có kiểu là ISort
Nghĩa là dsmh sẽ được khai báo là

List< ISort > dsmh = new Arraylist<>();

Nếu mà vậy thì dsmh không chỉ add được môn học mà còn add được cái khác. Vậy thì lại hỏng mất danh sách.
Em có làm thử thì phát hiện được vậy ạ.

1 Like

Đúng rồi đấy bạn.
Đó là lý do có tham số kiểu. Nó sẽ giới hạn trong một số lớp, tránh bị sử dụng bừa bãi.

1 Like

Vậy giờ mình phải làm gì đây

Hử???
Lúc khai báo thì bạn vẫn khai báo bình thường được mà.
Còn khi truyền vào phương thức thì vẫn ổn thôi.
Sửa thành thế này:

public List<? extends ISort> SortByName(List<? extends ISort> list)

Ổn cả:

List<Subject> sub = new ArrayList<>();
List<Student> std = new ArrayList<>();
// ...
SortByName(sub);
SortByName(std);
1 Like

Đúng là được thật.

<? extends ISort > cái này nghĩa là bất cứ danh sách nào mà chứa đối tượng là lớp con của lớp ISort thì đều sắp xếp được. Hay Cảm ơn bạn đã dành thời gian cho mình.
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?