Sắp xếp danh sách sinh viên giảm dần theo điểm Java

Khỏi phải nói dài dòng vì ai lập trình cũng biết việc sắp xếp được dùng đi dùng lại rất nhiều trong lập trình và cuộc sống. Có thể kể ra vài trường hợp như: Sắp xếp các sinh viên trong lớp, sắp xếp nhân viên trong công ty,… Trong bài viết này chúng ta sẽ cùng tìm hiểu cách sắp xếp với ví dụ sắp xếp sinh viên trong lớp.

Level 1: Nhập vào tên các sinh viên. Sắp xếp và in ra màn hình danh sách sinh viên đã sắp xếp.

Quá dễ phải không? – Vì đề bài không cho trước số sinh viên trong lớp, chỉ biết có thể có 1 hoặc nhiều sinh viên => dùng ArrayList – Chỉ quan tâm đến tên => dùng ArrayList

– Để sắp xếp List, ArrayList,… chúng ta dùng Collections.sort(), với những mảng như String[], int[] thì dùng Arrays.sort().

Đề bài: Viết chương trình sử dụng ngôn ngữ lập trình Java để quản lý sinh viên gồm các chức năng cơ bản như sau:

  1. Nhập danh sách sinh viên
  2. Xem danh sách sinh viên
  3. Sắp xếp và hiển thị danh sách sinh viên theo chiều tăng dần của điểm trung bình
  4. Tìm kiếm sinh viên theo tên

Giả sử mỗi sinh viên gồm các thuộc tính như ID, tên và điểm trung bình.
Yêu cầu kiến thức:

  • Xác định đối tượng chương trình từ đối tượng thực tế
  • Phân tích, xác định các thuộc tính cũng như phương thức của từng đối tượng
  • Xác định đúng kiểu dữ liệu cho các biến và các hàm
  • Phân chia thành các hàm cho hợp lý

Cấu trúc thư mục: src |——BuildClass    |——Student.java    |——SortByDiemTB.java    |——QuanLySinhVien.java |——UseClass    |——MainClass.java

Code tham khảo dưới đây được viết trên JDK ver 8.x:


File Student.java: package BuildClass; import java.util.Scanner; public class Student { // Thuoc tinh private int id; private String ten; private double diemTB; // Phuong thuc // Ham khoi tao khong doi so public Student() { } // Ham khoi tao co doi so public Student(int id, String ten, double diemTB) { this.id = id; this.ten = ten; this.diemTB = diemTB; } // Ham nhap vao thong tin sinh vien public void nhapThongTin(Scanner sc) { System.out.print("\tNhap id: "); id = sc.nextInt(); System.out.print("\tNhap ten: "); sc.nextLine(); ten = sc.nextLine(); System.out.print("\tNhap diem trung binh: "); diemTB = sc.nextDouble(); } // Ham hien thi thong tin sinh vien public void hienThiThongTin() { System.out.println("\tId: " + id); System.out.println("\tTen: " + ten); System.out.println("\tDiem trung binh: " + diemTB); } // Ham lay thong tin diem trung binh public double getDiemTB() { return diemTB; } // Ham lay thong tin ten sinh vien public String getTen() { return ten; } }

File SortByDiemTB.java:

package BuildClass; import java.util.Comparator; public class SortByDiemTB implements Comparator { // Ham so sanh 2 doi tuong student public int compare(Student a, Student b) { return (int) (a.getDiemTB() - b.getDiemTB()); } }

File QuanLySinhVien.java:

package BuildClass; import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; public class QuanLySinhVien { // Thuoc tinh private ArrayList dssv; // Phuong thuc // Ham khoi tao public QuanLySinhVien() { dssv = new ArrayList(10); } // Ham them sinh vien vao danh sach public void themSV(Student sv) { dssv.add(sv); } // Ham nhap danh sach sinh vien public void nhapDanhSach(Scanner sc) { Student sv; System.out.print("Nhap so luong sinh vien: "); int n = sc.nextInt(); System.out.println("Nhap danh sach sinh vien: "); for (int i = 0; i < n; i++) { System.out.println("Sinh vien thu " + (i + 1) + " la:"); sv = new Student(); sv.nhapThongTin(sc); // Them sv vao danh sach themSV(sv); } } // Ham hien thi danh sach sinh vien public void hienThiDanhSach() { int i = 1; for (Student sv : dssv) { System.out.println("Sinh vien thu " + i + " la:"); sv.hienThiThongTin(); i++; } } // Ham sap xep sinh vien theo chieu tang dan cua diem trung binh public void sapXepTheoDiemTB() { // Sap xep Collections.sort(dssv, new SortByDiemTB()); } // Ham tim kiem sinh vien theo ten public void timKiemTheoTen(String name) { for (Student sv : dssv) { if (name.equals(sv.getTen())) { sv.hienThiThongTin(); } } } }

File MainClass.java:

package UseClass; import BuildClass.QuanLySinhVien; import java.util.Scanner; public class MainClass { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // Khai bao doi tuong quan ly QuanLySinhVien ql = new QuanLySinhVien(); ql.nhapDanhSach(sc); System.out.println("Danh sach sinh vien vua nhap la:"); ql.hienThiDanhSach(); ql.sapXepTheoDiemTB(); System.out.println("Danh sach sinh vien sau khi sap xep la:"); ql.hienThiDanhSach(); // Nhap ten can tim kiem System.out.print("Nhap vao ten sinh vien can tim kiem: "); sc.nextLine(); String name = sc.nextLine(); System.out.println("Thong tin sinh vien co ten la " + name + " la:"); ql.timKiemTheoTen(name); sc.close(); } }


Kết luận:

  • Bạn có thể tham khảo thêm khóa học lập trình C từ cơ bản đến nâng cao. Xem tại đây
  • Bạn có thể tham khảo thêm khóa học Thành thạo lập trình C#. Xem tại đây
  • Bạn có thể tham khảo thêm khóa học Ôn tập OOP cơ bản trong Java. Xem tại đây

Diễn đàn Android - Cộng đồng Android Việt Nam

Trang chủ Diễn đàn > LẬP TRÌNH MOBILE > Lập trình Java > Java cơ bản >

Thảo luận trong 'Java cơ bản' bắt đầu bởi Tiasangmoi92, 23/8/13.

Sắp xếp danh sách sinh viên giảm dần theo điểm Java

Sắp xếp danh sách sinh viên giảm dần theo điểm Java

Viết chương trình thực hiện các yêu cầu sau:

  • Khai báo một danh sách liên kết lưu trữ danh sách thông tin sinh viên. Thông tin của 1 sinh viên bao gồm tên và điểm của sinh viên đó.
  • Thêm sinh viên vào trong danh sách vừa tạo. Việc nhập sinh viên sẽ dừng lại khi người dùng nhập họ tên sinh viên là một chuỗi rỗng.
  • Đếm số sinh viên phải thi lại và hiển thị thông tin của những sinh viên đó ra. Sinh viên phải thi lại khi điểm của sinh viên đó <= 5.
  • Hiển thị các sinh viên có điểm cao nhất. Nếu có nhiều sinh viên bằng điểm thì phải hiển thị tất cả những sinh viên đó ra.
  • Tìm kiếm sinh viên theo tên và hiển thị thông tin sinh viên vừa tìm được.

Sắp xếp danh sách sinh viên giảm dần theo điểm Java

Bài giải

-------------------- ######## --------------------

Trong bài tập này, tôi sẽ sử dụng phối hợp các kiến thức về ép kiểu dữ liệu, vòng lặp for, while, chuỗi, mảng và danh sách liên kết để giải. Bài tập này tuy hay nhưng khá phức tạp. Các bạn cố gắng đọc thật kỹ để hiểu được nhé!

Sắp xếp danh sách sinh viên giảm dần theo điểm Java

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Bài giải

public static void main(String[] args) { String tenSinhVien, thongTin = null; String arrThongTin[]; // mảng lưu trữ thông tin sinh viên double diemSinhVien; // lưu trữ danh sách sinh viên LinkedList danhSachSV = new LinkedList<>(); // lưu trữ danh sách sinh viên thi lại LinkedList svThiLai = new LinkedList<>(); // lưu trữ danh sách sinh viên có điểm cao nhất LinkedList svDiemCao = new LinkedList<>(); // lưu trữ danh sách sinh viên cần tìm LinkedList svCanTim = new LinkedList<>(); Scanner scanner = new Scanner(System.in); // thêm danh sách sinh viên // nếu tên sinh viên khác rỗng thì còn nhập // ngược lại không nhập nữa do { System.out.println("Nhập vào tên sinh viên: "); tenSinhVien = scanner.nextLine(); if (!tenSinhVien.isEmpty()) { System.out.println("Nhập vào điểm sinh viên: "); diemSinhVien = Double.parseDouble(scanner.nextLine()); thongTin = tenSinhVien + "\t" + diemSinhVien; danhSachSV.add(thongTin); } } while (!tenSinhVien.isEmpty()); // khi tên còn khác rỗng thì còn nhập // hiển thị số sinh viên // và thông tin của các sinh viên có trong danh sách System.out.println("Số sinh viên có trong danh sách = " + (danhSachSV.size())); System.out.println("Thông tin của các sinh viên vừa nhập là: "); System.out.println("Tên sinh viên\t Điểm"); Iterator iterator = danhSachSV.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } // đếm số sinh viên phải thi lại // và lưu thông tin những sinh viên đó vào trong svThiLai for (int i = 0; i < danhSachSV.size(); i++) { // lấy sinh viên tại vị trí i trong danhSachSV String sv = danhSachSV.get(i); // chuyển đổi chuỗi sv thành mảng // mảng arrThongTin sẽ chứa tên và điểm của sinh viên đó arrThongTin = sv.split("\t"); // arrThongTin[1] sẽ tương ứng với điểm của sinh viên // vì nó có kiểu là String nên phải ép kiểu về Double // sau đó gán vào biến point double point = Double.parseDouble(arrThongTin[1]); // nếu point <= 5 thì sẽ thêm sinh viên đó // vào trong svThiLai if (point <= 5) { svThiLai.add(sv); } } if (svThiLai.isEmpty()) { System.out.println("Không có sinh viên phải thi lại!"); } else { System.out.println("Số sinh viên phải thi lại = " + (svThiLai.size())); System.out.println("Thông tin của các sinh viên phải thi lại là: "); System.out.println("Tên sinh viên\t Điểm"); iterator = svThiLai.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } double maxTemp = 0; // số điểm lớn nhất int i = 0; // chỉ số của phần tử // tìm điểm lớn nhất trong danh sách while (i < danhSachSV.size()) { arrThongTin = danhSachSV.get(i).split("\t"); // nếu điểm của sinh viên có chỉ số i trong danhSachSV // lớn hơn hoặc bằng số điểm lớn nhất maxTemp // thì sẽ gán maxTemp bằng điểm của sinh viên đó // và tăng i lên 1 sau đó quay lại vòng lặp while if (Double.parseDouble(arrThongTin[1]) >= maxTemp) { maxTemp = Double.parseDouble(arrThongTin[1]); } i++; } // tìm sinh viên có điểm cao nhất i = 0; while (i < danhSachSV.size()) { arrThongTin = danhSachSV.get(i).split("\t"); // duyệt trong danhSachSV // nếu có sinh viên nào có số điểm bằng với maxTemp // thì sẽ thêm sinh viên đó vào trong svDiemCao if (Double.parseDouble(arrThongTin[1]) == maxTemp) { svDiemCao.add(danhSachSV.get(i)); } i++; } System.out.println("Thông tin của các sinh viên có điểm cao nhất là: "); System.out.println("Tên sinh viên\t Điểm"); iterator = svDiemCao.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } // Tìm kiếm theo tên sinh viên System.out.println("Nhập tên sinh viên cần tìm: "); String search = scanner.nextLine(); i = 0; while (i < danhSachSV.size()) { // tách thông tin của sinh viên thứ i trong danhSachSV // thành 2 mảng lưu trữ tên và điểm số sinh viên đó arrThongTin = danhSachSV.get(i).split("\t"); // lấy tên sinh viên trong mảng arrThongTin // tên sẽ tương ứng với phần tử thứ 0 trong mảng tenSinhVien = arrThongTin[0]; // so sánh tên sinh viên cần tìm với tenSinhVien // nếu trùng nhau thì sẽ thêm sinh viên đó vào trong svCanTim if (search.equalsIgnoreCase(tenSinhVien)) { svCanTim.add(danhSachSV.get(i)); } i++; // tăng i lên 1 và quay lại đầu vòng lặp } System.out.println("Thông tin của các sinh viên tên là " + search + ": "); System.out.println("Tên sinh viên\t Điểm"); iterator = svCanTim.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } }

Kết quả sau khi biên dịch chương trình:

Sắp xếp danh sách sinh viên giảm dần theo điểm Java

Câu hỏi thường gặp liên quan:

Cùng chuyên mục:

Sắp xếp danh sách sinh viên giảm dần theo điểm Java