30/09/2018, 18:28

Viết method filter các thuộc tính khác nhau?

ArrayList kiểu sv, sv gồm tên (String), lớp (String), tuổi (int) và nhóm (int). Người ta kêu lọc thông tin sinh viên theo từng thuộc tính, mình nghĩ cách làm là overload phương thức filter, tham số truyền vào là thuộc tính gì thì lọc theo thuộc tính đó, nhưng vì các thuộc tính có kiểu giống nhau (String - String và int - int) nên mình bó tay. Ngoài ra mình cũng không nghĩ được cách nào khác ngoài cách overload …

Trung Nguyen Van viết 20:39 ngày 30/09/2018

Nếu bạn không muốn đặt tên phương thức khác nhau thì chỉ có cách truyền 1 tham số kèm theo mà thôi.

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

Thế còn cái String - String và int - int thì sao hả bạn?

Nguyễn Hải Đăng viết 20:38 ngày 30/09/2018

Bạn muốn filter xong rồi cho ra List mới hay thế nào?

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

Đúng rồi bạn, nhưng cho ra list mới hay chỉ in ra thôi cũng đc

Nguyễn Hải Đăng viết 20:34 ngày 30/09/2018
public class FilterDemo {
    public static void main(String[] args) {
       SinhVien sv1 = new SinhVien("Jack", 17, 2);
       SinhVien sv2 = new SinhVien("Peter", 18, 1);
       SinhVien sv3 = new SinhVien("John", 19, 2);
       SinhVien sv4 = new SinhVien("David", 20, 3);
       
       List<SinhVien> svList = new ArrayList<>();
       
       svList.add(sv1);
       svList.add(sv2);
       svList.add(sv3);
       svList.add(sv4);
       List<SinhVien> filteredList = new ArrayList<>();
       //List các sinh viên có tuổi <= 19 và thuộc nhóm 2 (Java 8 Lambda Expression)
       filteredList = svList.stream().filter(sv -> sv.getTuoi() <= 19 && sv.getNhom() == 2).collect(Collectors.toList());
    }
    
}

class SinhVien{
    private String ten;
    private int tuoi;
    private int nhom;   
    
    public SinhVien(){        
    }
    
    public SinhVien(String ten, int tuoi, int nhom){
        this.ten = ten;
        this.tuoi = tuoi;
        this.nhom = nhom;
    }
    
    public String getTen() {
        return ten;
    }

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

    public int getTuoi() {
        return tuoi;
    }

    public void setTuoi(int tuoi) {
        this.tuoi = tuoi;
    }

    public int getNhom() {
        return nhom;
    }

    public void setNhom(int nhom) {
        this.nhom = nhom;
    }
}
huy vo viết 20:34 ngày 30/09/2018

Collectors.toList() không được bạn ơi, nó báo là không thể collect super object sang capture object…

Nguyễn Hải Đăng viết 20:40 ngày 30/09/2018

Bạn đưa code lên đây. Code của mình thì khi áp dụng sang của bạn đâu thể nguyên dạng được

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

SinhVien:

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() {
        this(0, 0, 0, "", "", "", "");
    }

    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.print("STT: " + this.STT +  " || " + this.HoLot + " " + this.Ten + " || Nhom: " + this.Nhom + " || To: " + this.To +
                " || Lop: " + this.Lop + " || MSSV: " + this.MaSoSV);
    }
}

Còn sinh viên cntt và sinh viên toán extends sinhvien, ngoài ra không có gì khác.

List:

import java.util.*;
import java.util.stream.Collectors;

public class List {
    private ArrayList<SinhVien> list;

    public List() {
            list = new ArrayList<SinhVien>();
        }

    public List(ArrayList<SinhVien> list) {
            this.list = list;
        }

    public ArrayList<SinhVien> getList() {
            return list;
        }

    public void addNew(SinhVien x) {
        for (SinhVien y : this.list) {
            if (y.getMaSoSV().equalsIgnoreCase(x.getMaSoSV())) {
                return;
            }
        }
        this.list.add(x);
    }

    public void showList() {
        for (SinhVien x : list) {
            x.showSV();
            System.out.println();
        }
    }

    public void updateSV(int index) {
        Scanner in = new Scanner(System.in);
        for (int i = 0; i < list.size(); i++) {
            if (i == index) {
                System.out.print("Nhap ho lot update: ");
                list.get(index).setNhom(in.nextInt());
                System.out.print("Nhap to update: ");
                list.get(index).setTo(in.nextInt());
                break;
            }
        }
    }

    public int searchSV(SinhVien x) {
        for (SinhVien y : list) {
            if (y.getMaSoSV().equalsIgnoreCase(x.getMaSoSV())) {
                System.out.println("Sinh vien co thong tin trung voi sinh vien " + x.getTen() + " la: ");
                y.showSV();
                return 0;
            }
        }
        System.out.println("Khong co " + x.getHoLot() + " " + x.getTen() + " trong danh sach");
        return 1;
    }
public void arrange() {
        Collections.sort(this.list, new Comparator<SinhVien>() {
            @Override
            public int compare(SinhVien x1, SinhVien x2) {
                int lopC = x1.getLop().compareTo(x2.getLop());
                if (lopC != 0) {
                    return lopC;
                }
                int toC = String.valueOf(x1.getTo()).compareTo(String.valueOf(x2.getTo()));
                if (toC != 0) {
                    return toC;
                }
                int nhomC = String.valueOf(x1.getNhom()).compareTo(String.valueOf(x2.getNhom()));
                if (nhomC != 0) {
                    return nhomC;
                }
                int tenC = x1.getTen().compareTo(x2.getTen());
                if (tenC != 0) {
                    return tenC;
                }
                return String.valueOf(x1.getSTT()).compareTo(String.valueOf(x2.getSTT()));
            }
        });
    }

    public ArrayList<SinhVien> filter(String lop) {
        ArrayList<SinhVien> result = new ArrayList<SinhVien>();
        result = this.list.stream().filter(sv -> sv.getLop() == lop).collect(Collectors.toList());
        return result;
    }
}

Tuy nhiên nếu mình muốn overloads hàm filter nhưng tham số truyền vào lại trùng kiểu với nhau thì không biết phải xử lý thế nào…

Nguyễn Hải Đăng viết 20:45 ngày 30/09/2018

Code của bạn vừa nhìn qua thì thấy có 2 vấn đề:

  1. Biến result của bạn, bạn khai báo kiểu là ArrayList. Nhưng Collectors.toList trả về List. Bạn nên khai báo lại thành List. Có lẽ mình sẽ viết bài giải thích rõ hơn về kiểu khai báo và kiểu thực trong nay mai.
  2. Field Lop trong class SinhVien là kiểu String, bạn không nên so sánh bằng toán tử == mà hãy dùng hàm equals(). Google thêm nhé.

Tuy nhiên nếu mình muốn overloads hàm filter nhưng tham số truyền vào lại trùng kiểu với nhau thì không biết phải xử lý thế nào…

Trường hợp này bạn nên khai báo các phương thức filter khác nhau, filterByLop, filterByName…

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

Cám ơn bạn, hóng cái bài viết sắp tới của bạn…

Nguyễn Hải Đăng viết 20:37 ngày 30/09/2018

Cảm ơn thì like và post lên show đã thành công là được rồi. Mình rất vui khi thấy bạn làm được.

Bài liên quan
0