如何排序地图,而使用具有可比性和比较器接口?如何编写自定义排序?

维德·普拉卡什:

问题 -我有一个学生类,它包含名称,卷号,三主题标记M1,M2,M3,和总的痕迹。我需要梳理Student对象根据其总标记如果有两个或以上的学生标记是相等的,那么排序就根据自己的名字。 -我有谷歌,但没有得到预期计算器问题的解决每一个使用具有可比性和比较器接口。

我已创建的类Studnt

public class Student {
    private String name;
    private Integer rollNumber;
    private int m1;
    private int m2;
    private int m3;
    private int totMarks;
    //Getter setter
}

大类

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);
        }

    }
}

其实,我使用TreeMap中它的排序值的键(占总分是我TreeMap中键)。但两个或两个以上的学生有平等的痕迹。然后,旧的学生对象(值)取代,因为主要的新的学生不允许重复

产量

6 =学生[NAME =粘弹性阻尼器,rollNumber = 12,M 1 = 2,M2 = 2,M3 = 2,totMarks = 6]

9 =学生[名称=普拉卡什,rollNumber = 56,M1 = 3,M2 = 3,M3 = 3,totMarks = 9]

存储在地图中唯一独特totMarks

每个人:

既然你不能利用现有的比较或排序算法,你需要做的是你自己。我已经实现一个static函数lessOrEqual,它接受2分Student的情况下,对它们进行比较,并返回是否s1是小于或等于s2 larger(Student s1, Student s2)返回true IF ONLY s1大于s2可以有这样做的许多不同的方式,这真的取决于你,因为它只是一个comprison。该函数首先检查成绩,如果成绩相匹配,它会再检查名称和相应的回报。

编辑:正如你可以看到我换成lessOrEquallarger,因为选择排序我使用需求寻找larger这是同样的效果,我只能这样做是为了某种更好的可读性。

然后,我实现了另一个static接受功能ArrayList<Student>,排序,和它排序后返回。所使用的排序算法是很基本的:选择排序。它的O(N ^ 2),这是效率不高的,但我是做简单的在下面的演示起见。

码:

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());
        }
    }
}

输出:

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

笔记:

1)见另外,学生的顺序进入榜单,这是4,3,1,那么2。这是证明它根据名称排序时,等级匹配(杰克·史密斯VS约翰·史密斯)。

2)我存的是学生作一个更好的演示。

3)您可能会注意到,我没有设置任何其他变量,因为这个问题仅仅是有关排序,唯一的贡献变量的排序是:nametotMarks你将不得不做休息。

4)我使用的ArrayList,但不限于,与简单的改变,你可以用它正常的Student[]阵列。

5)该函数larger不必是static,你可以把它的成员函数和不同的方式使用它。例如,上面的代码会改变为:

    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;
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android自定义排序使用可比性

具有可比性的Java排序

Java使自定义对象具有可比性?

如何编写自定义比较器对SortedMap排序?

如何编写自定义比较器以使用SimpleEntry对树集进行排序?

ArrayList对象的排序使用可比性

具有流排序和自定义比较器的java.lang.ClassCastException

提供自定义比较器或元素实现可比性时,请拆分方法中的逻辑。

如何使两个对象具有可比性

如何让我的课程在 Python 中具有可比性?

为了使自定义类的对象具有可比性,仅定义__eq__和__lt__系列中的几个成员就足够了吗?

Clojure:按嵌套地图自定义比较器排序

Python 3排序:删除了自定义比较器,转而使用键-为什么?

使用具有变化值的自定义顺序来概括向量的排序

如何在GWT中对List <int []>进行排序?使用自定义比较器失败

使用自定义比较器时,C++ 排序函数如何工作?

如何在元组值上使用自定义比较器创建字典的排序表示?

如何使用自定义比较器对整数数组进行排序?

如何使用自定义的比较器以不同的词法顺序对数组排序?

使用自定义比较器定义地图,其中值数据结构也具有自定义比较器

如何编写自定义排序器,以在UI中按名称对springdoc swagger标签进行排序?

如何在Java 8中定义自定义排序比较流比较的键和值

如何通过可比较的接口对对象数组进行排序?

使列表和 QuerySet 具有可比性

使用自定义比较器对ArrayList <String>进行排序

绝对值排序,使用自定义比较器

使用可比性比较不同变量

无法使用std :: sort和自定义比较器对数组进行排序

在C ++中创建自定义地图类时,如何在模板中定义和使用比较器