30/09/2018, 18:15

Sắp xếp các đối tượng trong danh sách

Lấy ví dụ mình có 1 arraylist gồm các sinh viên, đối tượng sinh viên gồm có mã số sinh viên (string) và tuổi (int). Mình muốn sắp xếp list lại theo tuổi và mã số từ thấp đến cao thì phải làm thế nào? Trong Java có sẵn phương thức sắp xếp như vậy không hay mình phải tự code? Cám ơn trước, ai đọc và biết mà không chỉ là coi như có lỗi với tui xD

Gió viết 20:20 ngày 30/09/2018

Dùng Collections.sort để sort ArrayList

VD

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

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

}    

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        ArrayList<Student> list=new ArrayList<>();
        
        list.add(new Student("1",20,"A"));
        list.add(new Student("2",32,"B"));
        list.add(new Student("3",15,"C"));
        
    
        Comparator<Student> cmp=new Comparator<Student>(){
            public int compare(Student a,Student b){
                if(a.age!=b.age){
                    return a.age-b.age;
                }
                return a.id.compareTo(b.id);
            }
        };
        
        Collections.sort(list,cmp);
        
        for(Student x: list){
            System.out.printf("%s %d %s\n",x.id,x.age,x.name);
        }
        
    }
}
huy vo viết 20:30 ngày 30/09/2018

Sẵn cho mình hỏi luôn được không bạn, mình có lớp SinhVien trong đó id kiểu String, rồi tạo thêm lớp SinhVienToan extends SinhVien nhưng id kiểu int. Vậy thì nó báo lỗi mấy chỗ get set id của SinhVienToan. Mình giải quyết bằng cách convert qua lại liệu đã ổn hay chưa? Kiểu trả về Object có nghĩa là gì? Cám ơn…

Cương Nguyễn viết 20:20 ngày 30/09/2018

Bạn không cần phải tạo ra thêm 1 id nữa ở SinhVienToan, dùng luôn id của SinhVien được rồi, bản chất SinhVIenToan cũng là SinhVien mà.

huy vo viết 20:27 ngày 30/09/2018

vậy là trong lớp con cái gì lớp mẹ chưa có thì viết ra, cái gì khác lớp mẹ thì override còn cái gì giống thì khỏi viết hả bạn?

Cương Nguyễn viết 20:19 ngày 30/09/2018

Thường thì luôn là như thế nhé bạn, vì cha nó có rồi, nó kế thừa là nó cũng có luôn, cần gì phải tạo ra thêm 1 cái khác nữa đúng không

huy vo viết 20:20 ngày 30/09/2018

Mình vẫn chưa hiểu, đây là code nguyên mẫu của mình, gồm sinhvien, sinhvientoan và sinhviencntt. Trong đó id của sinhviencntt bắt buộc là int còn sinhvientoan bắt buộc là string.

public class SinhVien {
    private int STT;
    private int Nhom;
    private int To;
    private String MaSoSV;
    private String HoLot;
    private String Ten;
    private String Lop;

    public SinhVien() {
    }

    public SinhVien(int STT, int Nhom, int To, String Lop, String MaSoSV, String HoLot, String Ten) {
        this.STT = STT;
        this.Nhom = Nhom;
        this.To = To;
        this.MaSoSV = MaSoSV;
        this.Ten = Ten;
        this.HoLot = HoLot;
        this.Lop = Lop;
    }

    public String getTen() {
        return this.Ten;
    }

    public String getLop() {
        return this.Lop;
    }

    public String getHoLot() {
        return this.HoLot;
    }

    public String getMaSoSV() {
        return this.MaSoSV;
    }

    public int getSTT() {
        return this.STT;
    }

    public int getTo() {
        return this.To;
    }

    public int getNhom() {
        return this.Nhom;
    }

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

    public void setHoLot(String HoLot) {
        this.HoLot = HoLot;
    }

    public void setMaSoSV(String MaSoSV) {
        this.MaSoSV = MaSoSV;
    }

    public void setLop(String Lop) {
        this.Lop = Lop;
    }

    public void setSTT(int STT) {
        this.STT = STT;
    }

    public void setTo(int To) {
        this.To = To;
    }

    public void setNhom(int Nhom) {
        this.Nhom = Nhom;
    }

    public void showSV() {
        System.out.println(this.STT + " " + this.Nhom + " " + this.To + " "
                + this.MaSoSV + " " + this.HoLot + " " + this.Ten);
    }
public class SinhVienCNTT extends SinhVien {
    private int STT;
    private int Nhom;
    private int To;
    private int MaSoSV;
    private String HoLot;
    private String Ten;
    private String Lop;

    public SinhVienCNTT() {}

    public SinhVienCNTT(int STT, int Nhom, int To, String Lop, int MaSoSV, String HoLot, String Ten) {
        this.STT = STT;
        this.Nhom = Nhom;
        this.To = To;
        this.MaSoSV = MaSoSV;
        this.Ten = Ten;
        this.HoLot = HoLot;
        this.Lop = Lop;
    }

    public String getTen() {
        return this.Ten;
    }

    public String getLop() {
        return this.Lop;
    }

    public String getHoLot() {
        return this.HoLot;
    }

    public String getMaSoSV() {
        return String.valueOf(this.MaSoSV);

    }

    public int getSTT() {
        return this.STT;
    }

    public int getTo() {
        return this.To;
    }

    public int getNhom() {
        return this.Nhom;
    }

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

    public void setHoLot(String HoLot) {
        this.HoLot = HoLot;
    }

    public void setMaSoSV(String MaSoSV) {
        this.MaSoSV = Integer.parseInt(MaSoSV);
    }

    public void setLop(String Lop) {
        this.Lop = Lop;
    }

    public void setSTT(int STT) {
        this.STT = STT;
    }

    public void setTo(int To) {
        this.To = To;
    }

    public void setNhom(int Nhom) {
        this.Nhom = Nhom;
    }

    public void showSV() {
        System.out.println(this.STT + " " + this.Nhom + " " + this.To + " "
                + this.MaSoSV + " " + this.HoLot + " " + this.Ten);
    }
}
public class SinhVienToan extends SinhVien {
    private int STT;
    private int Nhom;
    private int To;
    private String MaSoSV;
    private String HoLot;
    private String Ten;
    private String Lop;

    public SinhVienToan() {}

    public SinhVienToan(int STT, int Nhom, int To, String Lop, String MaSoSV, String HoLot, String Ten) {
        this.STT = STT;
        this.Nhom = Nhom;
        this.To = To;
        this.MaSoSV = MaSoSV;
        this.Ten = Ten;
        this.HoLot = HoLot;
        this.Lop = Lop;
    }

    public String getTen() {
        return this.Ten;
    }

    public String getLop() {
        return this.Lop;
    }

    public String getHoLot() {
        return this.HoLot;
    }

    public String getMaSoSV() {
        return this.MaSoSV;
    }

    public int getSTT() {
        return this.STT;
    }

    public int getTo() {
        return this.To;
    }

    public int getNhom() {
        return this.Nhom;
    }

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

    public void setHoLot(String HoLot) {
        this.HoLot = HoLot;
    }

    public void setMaSoSV(String MaSoSV) {
        this.MaSoSV = MaSoSV;
    }

    public void setLop(String Lop) {
        this.Lop = Lop;
    }

    public void setSTT(int STT) {
        this.STT = STT;
    }

    public void setTo(int To) {
        this.To = To;
    }

    public void setNhom(int Nhom) {
        this.Nhom = Nhom;
    }

    public void showSV() {
        System.out.println(this.STT + " " + this.Nhom + " " + this.To + " "
                + this.MaSoSV + " " + this.HoLot + " " + this.Ten);
    }
}

Và cuối cùng, trong phương thức main

 SinhVien a = new SinhVienCNTT(1, 1, 1, "301", 51403394, "Huy", "Vo");
 SinhVien b = new SinhVienToan(2, 2, 1, "302", "51403395", "Tran", "A");
Cương Nguyễn viết 20:28 ngày 30/09/2018

tai sao lại phải bắt buộc MSSV của SV là int và SVtoan la String?

Nguyen Ca viết 20:21 ngày 30/09/2018

Vậy lớp cha dùng Object type cho Mã SV đi. chắc ý thầy muốn dùng generic Type.

huy vo viết 20:19 ngày 30/09/2018

tại vì trường mình học mssv của khoa cntt toàn số còn của khoa toán thì toàn chữ :v

huy vo viết 20:30 ngày 30/09/2018

Mình chưa hiểu cái kiểu object đó cho lắm, dùng object thì type của phương thức cũng object luôn hả bạn? Mà các bạn thấy mình tạo class kế thừa như vậy đã ổn chưa, có “dư” thuộc tính không?

Nguyen Ca viết 20:31 ngày 30/09/2018

Đúng rồi bạn như vậy:

public class Box {
    private Object object;

    public void set(Object object) { this.object = object; }
    public Object get() { return object; }
}

Mà như bạn nói :

[quote=“huyvo, post:10, topic:13239”]
tại vì trường mình học mssv của khoa cntt toàn số còn của khoa toán thì toàn chữ
[/quote] thì dùng String cho lành vừa chữ vừa số.

Mà các bạn thấy mình tạo class kế thừa như vậy đã ổn chưa, có “dư” thuộc tính không?

Dư rất nhiều. Thuộc tính ở lớp cha có thể sử dụng lại ở lớp con thì bạn không cần khai báo ở lớp con nữa.

huy vo viết 20:15 ngày 30/09/2018

Tại vì đề nó bắt buộc phải dùng int mà =]] Nếu k cần khai báo lại thì mỗi lần dùng mình cứ super. ra hả bạn?

Nguyen Ca viết 20:18 ngày 30/09/2018

Nếu k cần khai báo lại thì mỗi lần dùng mình cứ super.

Bạn chỉ dùng supper trong trường hợp như ví dụ sau:

  • Lớp cha có method/property là message;
  • Lớp con overide là method/property message. Bạn muốn dùng lại method/property message của lớp cha thi dùng là:
supper.message;

Còn bình thường thì gọi trực tiếp là được:

public class A {
	String rs = "test";
}
public class Test extends A {

	public static void main(String[] args) {
		
		Test test = new Test();
		System.out.println( test.rs);
	}

}

Tri viết 20:15 ngày 30/09/2018

Cho mình hỏi, với code ở trên nếu ở lớp SVToan kế thừa lớp SV có thêm thuộc tính điểm kieu float, mình muốn sắp xếp arraylist theo điểm thì có làm dc ko? Và nếu làm dc thì xử lý như thế nào?

p/s: arraylist bao gồm đối tượng SV và SVToan

Bài liên quan
0