比較可能とコンパレータのインターフェイスを使用せずにマップをソートする方法は?カスタムの並べ替えを書くためにどのように?

VEDプラカシュ:

問題点 -私は学生のクラスを持って、それは名前、ロール番号、3対象マークM1、M2、M3、および合計マークが含まれています。私は2つ以上の学生マークは、それが自分の名前に応じて並べ替え、次に等しい場合は、その合計マークに応じて学生のオブジェクトをソートする必要があります。 -私はそれをGoogleに持っていますが、同等とコンパレータインタフェースを使用して一人一stackoverflowの問題の解決策を期待得ていません。

私はクラス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のに重要である)を使用しています。しかし、2人の以上の学生が同じマークを持っています。そして、古い学生のオブジェクト(値が)ので、キーの新しい学生に置き換え重複は許されません

出力

6 =生徒[NAME = VED、rollNumber = 12、M 1 = 2、M2 = 2、M3 = 2、totMarks = 6]

9 =学生[NAME =プラカシュ、rollNumber = 56、M1 = 3、M2 = 3、M3 = 3、totMarks = 9]

マップに保存されている唯一のユニークtotMarks

全員 :

既存のコンパレータやソートアルゴリズムを使用することはできませんので、あなた自身でそれを行う必要があります。私が実装しているstatic機能lessOrEqual2つの受け入れるStudentか否かそれらとリターンを比較し、インスタンスs1少ないかに等しいですs2 larger(Student s1, Student s2)これはのみtrueを返すs1よりも大きくなっていますs2それだけでcomprisonだとしてこれを行うためのさまざまな方法が存在することができ、それはあなたに本当に最高です。グレードが一致した場合の機能を最初にチェックグレードは、それはその後、名前を確認し、それに応じて返されます。

EDIT:あなたは、私が置き換え見ることができるよう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。これは、グレードはジョン・スミス対(ジャック・スミス)と一致したときに、それは名前に基づいてソートすることを証明することです。

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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=210309&siteId=1