Cómo trazar una especie sin necesidad de utilizar la interfaz Comparable y Comparator? Cómo escribir Clasificación personalizada?

Ved Prakash:

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

Todo el mundo :

Como no se puede utilizar algoritmos Comparador existentes o de clasificación, tiene que hacerlo por su cuenta. He implementado una staticfunción lessOrEqualque acepta 2 Studentcasos, ellos y vuelve compara si es o no s1es menor o igual a s2. larger(Student s1, Student s2)que devuelve cierto sólo si s1es 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 lessOrEqualcon largerdesde 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 staticfunció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: namee 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 largerno 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;
    }

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=210312&siteId=1
Recomendado
Clasificación