Problema - Tengo una clase del estudiante, que contiene el nombre, número de rollo, tres sujetos marcas M1, M2, M3 y puntuación total. Necesito clasificar objeto Student según sus puntuaciones totales si marca dos o más estudiantes son iguales luego clasificarla según su nombre. Nota - Tengo que google pero no consiguiendo solución en cuestión stackoverflow espera que cada uno usando interfaz Comparable y Comparator.
He creado la clase Studnt
public class Student {
private String name;
private Integer rollNumber;
private int m1;
private int m2;
private int m3;
private int totMarks;
//Getter setter
}
Clase principal
public class StudentData {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enetr the number of Student");
int totalStudent = sc.nextInt();
Map<Integer,Student> map = new TreeMap<Integer,Student>();
for(int i =0;i<totalStudent;i++) {
Student ss = new Student();
System.out.println("Enter the Student roll number");
ss.setRollNumber(sc.nextInt());
System.out.println("Enter the Student Name");
ss.setName(sc.next());
System.out.println("Enter the m1 marks ");
ss.setM1(sc.nextInt());
System.out.println("Enetr the m2 marks ");
ss.setM2(sc.nextInt());
System.out.println("Enter the m3 marks ");
ss.setM3(sc.nextInt());
ss.setTotMarks(ss.getM1()+ss.getM2()+ss.getM3());
map.put(ss.getTotMarks(),ss);
ss=null;
}
//stdList.forEach(System.out::print);
for(Map.Entry<Integer,Student> m :map.entrySet()) {
System.out.println(m);
}
}
}
En realidad, estoy usando TreeMap que tipo el valor de clave (puntuación total es clave en mi TreeMap). pero dos o más estudiantes tienen marcas iguales. Entonces objeto estudiante de más edad (valor) sustituido por el nuevo estudiante debido a su llave no permitió duplicado
salida
6 = Student [name = ved, rollNumber = 12, m1 = 2, m2 = 2, m3 = 2, totMarks = 6]
9 = Student [name = Prakash, rollNumber = 56, m1 = 3, m2 = 3, m3 = 3, totMarks = 9]
los totMarks única únicos almacenados en el mapa
Como no se puede utilizar algoritmos Comparador existentes o de clasificación, tiene que hacerlo por su cuenta. He implementado una static
función lessOrEqual
que acepta 2 Student
casos, ellos y vuelve compara si es o no s1
es menor o igual a s2
. larger(Student s1, Student s2)
que devuelve cierto sólo si s1
es mayor que s2
. Puede haber muchas maneras diferentes de hacer esto, es realmente depende de ti, ya que es sólo un comprison. Los primeros controles de funcionamiento de los grados, si los grados de coincidencia, a continuación, comprobar el nombre y volver en consecuencia.
EDIT: Como se puede ver He sustituido lessOrEqual
con larger
desde la ordenación por selección que estoy usando para encontrar necesidades larger
. Es el mismo efecto, sólo lo hice para una mejor legibilidad de la especie.
A continuación, he implementado otra static
función que acepta ArrayList<Student>
, ordena y lo devuelve ordenadas. El algoritmo de clasificación utilizado es muy básico: Selección tipo. Es O (N ^ 2) que no es eficiente, pero lo hice por el bien de la simplicidad en la demostración a continuación.
Código:
import java.util.ArrayList;
public class Student {
private String name;
private Integer rollNumber;
private int m1;
private int m2;
private int m3;
private int totMarks;
public static boolean larger(Student s1, Student s2){
if(s1.totMarks < s2.totMarks) return false;
else if (s1.totMarks > s2.totMarks) return true;
// compare names
else return s1.name.compareTo(s2.name) > 0;
}
public static ArrayList<Student> sortSelection(ArrayList<Student> list){
for(int i=0; i<list.size(); i++){
for(int j=i+1; j< list.size(); j++){
if(larger(list.get(i), list.get(j))){ // swap
Student temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
}
}
return list;
}
//Getter setter
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getTotMarks(){
return totMarks;
}
public void setTotMarks(int totMarks){
this.totMarks = totMarks;
}
@Override
public String toString(){
return String.format("Name: %20s - Total Marks: %3d", name, totMarks);
}
public static void main(String[] args){
Student s1 = new Student();
Student s2 = new Student();
Student s3 = new Student();
Student s4 = new Student();
s1.setName("John Smith");
s1.setTotMarks(98);
s2.setName("Jack Smith");
s2.setTotMarks(98);
s3.setName("Adam Noob");
s3.setTotMarks(100);
s4.setName("Ved Parkash");
s4.setTotMarks(99);
ArrayList<Student> list = new ArrayList<>();
list.add(s4);
list.add(s3);
list.add(s1);
list.add(s2);
System.out.println("Array before sorting:");
for(int i=0; i<list.size(); i++){
System.out.println(list.get(i).toString());
}
Student.sortSelection(list);
System.out.println("Array after sorting:");
for(int i=0; i<list.size(); i++){
System.out.println(list.get(i).toString());
}
}
}
Salida:
Array before sorting:
Name: Ved Parkash - Total Marks: 99
Name: Adam Noob - Total Marks: 100
Name: John Smith - Total Marks: 98
Name: Jack Smith - Total Marks: 98
Array after sorting:
Name: Jack Smith - Total Marks: 98
Name: John Smith - Total Marks: 98
Name: Ved Parkash - Total Marks: 99
Name: Adam Noob - Total Marks: 100
notas:
1) Véase el orden de adición de los estudiantes en la lista, es 4,3, 1 y luego 2. Esto es para demostrar que ordena de acuerdo a los grados nombre cuando coinciden (Jack Smith vs John Smith).
2) Me hardcoded los estudiantes para hacer una mejor demostración.
3) Como se puede observar, no estoy fijando cualquiera de las otras variables ya que la cuestión es sólo acerca de la clasificación, y las variables que contribuyen únicamente a la clasificación son: name
e totMarks
. Usted tendrá que hacer el resto.
4) estoy usando ArrayList
, pero esto no se limita a eso, con cambios sencillos que se puede utilizar en una normal de Student[]
matriz.
5) La función larger
no tiene por qué ser static
, puede que sea una función miembro y utilizarlo de manera diferente. Por ejemplo, el código anterior podría cambiar a:
public boolean larger(Student other){
if(totMarks < other.totMarks) return false;
else if (totMarks > other.totMarks) return true;
// compare names
else return name.compareTo(other.name) > 0;
}
public static ArrayList<Student> sortSelection(ArrayList<Student> list){
for(int i=0; i<list.size(); i++){
for(int j=i+1; j< list.size(); j++){
// comparison way changes accordingly
if(list.get(i).larger(list.get(j))){ // swap
Student temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
}
}
return list;
}