01/10/2018, 08:21

Giúp em sắp xếp tăng giảm trong java

em làm sắp xếp tăng giảm nhưng lại lỗi, sữa mãi không biết chỗ nào, hi vọng mọi người giúp đỡ. Code e tự học nên mọi người góp ý để e hoàn thiện hơn ạ.
Lỗi đoạn :
Collections.sort(list);
Collections.reverse(list);

em chưa biết sữa thế nào cả
Code e đây:

 package Test;
 import java.util.*;
 class HoTen{
     String ten;
 void xem(){
     System.out.println("Họ và Tên: "+ten);
 }
 }
 class danhsach{
     ArrayList<HoTen> list = new ArrayList<>();
     Scanner input = new Scanner(System.in);
 void nhapten(HoTen ht){
     System.out.print("Mời bạn nhập họ tên: ");
     ht.ten = input.nextLine();
     if(ht.ten.equals("")){
         ht.ten=input.nextLine();
     }
     list.add(ht);
 }
 void xuatht(){
     if(list.size()==0){
         System.out.println("Chưa có họ tên: ");
     }
     else{
         for(int i=0;i<list.size();i++){
             list.get(i).xem();
         }
     }
 }
 void ngaunhien(){
     if(list.size()==0){
         System.out.println("Chưa có họ tên: ");
     }
     else{
         for(int i=0;i<list.size();i++){
             list.get(i).xem();
             Collections.shuffle(list);
         }
     }
 }
 void dao(){ // Ý 4 e chưa làm được không biết code sai chỗ nào.
     if(list.size()==0){
         System.out.println("Chưa có họ tên: ");
     }
     else{
         for(int i=0;i<list.size();i++){
             list.get(i).xem();
             Collections.sort(list);
             Collections.reverse(list);
         }
     }
 }
 void tim(){
     if(list.size()==0){
         System.out.print("Không có tên trong danh sách");
     }
     else{
         System.out.print("Mời bạn nhập họ tên muốn xóa: ");
         String ht1 = input.nextLine();
         boolean tim = false;
         for(HoTen ht: list){
             if(ht.ten.equals(ht1)){
                 list.remove(ht);
                 tim = true;
                 break;
             }
         }
     }
 }
 }
 public class test2 {
 static void Menu(){
     System.out.println("===============");
     System.out.println("Nhập lựa chọn tương ứng với số");
     System.out.println("1. Nhập danh sách Họ Tên");
     System.out.println("2. Xuất danh sách vừa nhập");
     System.out.println("3. Xuất danh sách ngẫu nhiên");
     System.out.println("4. Sắp xếp giảm dần và xuất danh sách");
     System.out.println("5. Tìm và xóa họ tên nhập và từ bàn phím");
     System.out.println("6. Kết thúc");
     System.out.println("===============");
         }
 public static void main(String[] args){
     int chon;
     danhsach ds = new danhsach();
     Scanner input = new Scanner(System.in);
     Menu();
     while(true){
         System.out.print("Mời bạn chọn 1 mục: ");
         chon= input.nextInt();
         switch(chon){
             case 1:
                 ds.nhapten(new HoTen());
                 break;
             case 2:
                 ds.xuatht();
                 break;
             case 3:
                 ds.ngaunhien();
                 break;
             case 4:
                 ds.ngaunhien();
                 break;
             case 5:
                 ds.tim();
                 break;
             case 6:
                 return;
         }
     }
 }
     }
vũ xuân quân viết 10:25 ngày 01/10/2018

Cái gì được sắp xếp tăng giảm ?

for(int i=0;i<list.size();i++){
list.get(i).xem();
Collections.sort(list);
Collections.reverse(list);
}

Xem ví dụ
https://www.tutorialspoint.com/java/util/collections_sort_comparable.htm

Dự trên ví dụ trên thì hàm sort này chỉ sắp xếp được chuỗi.
Còn hiện tại em cho sắp xếp object. Mình nghĩ là không được.
Muốn sắp xếp thì for cái list đó rồi mang đi so sánh tên của từng object hoTen.

Đỗ Trung Quân viết 10:30 ngày 01/10/2018

Nếu em sắp xếp 1 list các số nguyên thì làm như vậy là đúng. Nhưng hiện tại em đang sắp xếp 1 list các object. Vì vậy cần implement Comparable và override lại method CompareTo.
Vì code của em chưa clear nên anh lấy cái này làm ví dụ nhé.

public class Name implements Comparable<Name> {
    private final String firstName, lastName;

    public Name(String firstName, String lastName) {
        if (firstName == null || lastName == null)
            throw new NullPointerException();
        this.firstName = firstName;
        this.lastName = lastName;
    }
  
    //Bắt buộc class phải có setter và getter. Class HoTen ở trên của em chưa có setter + Constructor
    public String firstName() { return firstName; }
    public String lastName()  { return lastName;  }

    public boolean equals(Object o) {
        if (!(o instanceof Name))
            return false;
        Name n = (Name) o;
        return n.firstName.equals(firstName) && n.lastName.equals(lastName);
    }

    public int hashCode() {
        return 31*firstName.hashCode() + lastName.hashCode();
    }

    public String toString() {
	return firstName + " " + lastName;
    }

    public int compareTo(Name n) {
        int lastCmp = lastName.compareTo(n.lastName);
        return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName));
    }
}
public class NameSort {
    public static void main(String[] args) {
        Name nameArray[] = {
            new Name("John", "Smith"),
            new Name("Karl", "Ng"),
            new Name("Jeff", "Smith"),
            new Name("Tom", "Rich")
        };

        List<Name> names = Arrays.asList(nameArray);
        Collections.sort(names);
        System.out.println(names);
    }
}

Output

[Karl Ng, Tom Rich, Jeff Smith, John Smith]

Ở trên là sort theo natural sorting. (Sắp xếp tự nhiên - thông thường)
Trong trường hợp em muốn sort theo ý riêng của mình cần override lại comperator.

Muốn giải quyết ngắn gọn đoạn code của em thì đơn giản nhất là sử dụng class anonymous
Đầu tiên thêm Constructor và get set cho class HoTen

 public HoTen() {
  
    public HoTen(String ten) {
        this.ten = ten;
    }

    public String getTen() {
        return ten;
    }

    public void setTen(String ten) {
        this.ten = ten;
    }

Rồi sử dụng class anonymous cho method sort

    Collections.sort(list,new Comparator<HoTen>(){
                     public int compare(HoTen s1,HoTen s2){
                            return s1.getTen().compareTo(s2.getTen());
                     }});
Bài liên quan
0