0

ロール番号と名前を持つ学生クラスがあるとします。ロール番号で整理したいです。私は次のことを試しました.Hereは私のコードです:

package CollectionDemo;
import java.util.*;


class student1 implements Comparable<student1>{
    int rollNo;
    String name;

    student1(int rollNo,String name){
        this.rollNo=rollNo;
        this.name=name;
    }
    @Override
    public boolean equals(Object o){
        if((o instanceof student1) && (((student1)o).rollNo == rollNo)){
             return true;
        }
          else
        {
              return false;
        }
    }

    @Override
    public int hashCode(){
        return 1;
    }

    public int compareTo(student1 s) {
        return s.rollNo;
    }

    public String toString(){
        return "["+rollNo+","+name+"]";
    }
}
public class treeSetDemo {
    public static void main(String... a){

        Set<student1> set=new TreeSet<student1>();
        set.add(new student1(102,"Anu"));
        set.add(new student1(101,"Tanu"));
        set.add(new student1(103,"Minu"));

        System.out.println("elements:"+set);

    }
}

o/p: elements:[[102,Anu], [101,Tanu], [103,Minu]]

だから、それはソートされていません:(それを正しくする方法.

ご協力いただきありがとうございます。

================================================

ご助力いただきありがとうございます。次のコードは正常に実行されますが、equals と hashcode メソッドをコメントアウトすると、どのように機能するかを知りたいと思います。

package CollectionDemo;
import java.util.*;


class student1 implements Comparable<student1>{
    int rollNo;
    String name;

    student1(int rollNo,String name){
        this.rollNo=rollNo;
        this.name=name;
    }
   /* @Override
    public boolean equals(Object o){
        if((o instanceof student1) && (((student1)o).rollNo == rollNo)){
             return true;
        }
          else
        {
              return false;
        }
    }

    @Override
    public int hashCode(){
        return 1;
    }
*/
    public int compareTo(student1 s) {
        System.out.println("hello:"+(this.rollNo-s.rollNo));
        return this.rollNo-s.rollNo;
    }

    public String toString(){
        return "["+rollNo+","+name+"]";
    }
}
public class treeSetDemo {
    public static void main(String... a){

        Set<student1> set=new TreeSet<student1>();
        set.add(new student1(102,"Anu"));
        set.add(new student1(101,"Tanu"));
        set.add(new student1(103,"Minu"));

        System.out.println("elements:"+set);

    }
}

OP: run: hello:-1 hello:1 elements:[[101,Tanu], [102,Anu], [103,Minu]] BUILD SUCCESSFUL (合計時間: 0 秒)

4

5 に答える 5

1

次のようにcompareToメソッドを変更する必要があります

 public int compareTo(student1 s) {
    if(s.rollNo == this.rollNo){
        return 0;
    }else if(s.rollNo > this.rollNo){
        return -1;
    }else{
        return 1;
    }

}
于 2012-10-30T11:02:17.563 に答える
0

メソッドでは、compareTo比較しているオブジェクトの値を返すだけです。呼び出し元のインスタンスと渡されたインスタンスの属性の違いを返す必要があります。

したがって、compareToメソッドを次のように変更します。-

@Override
public int compareTo(student1 s) {
    return this.rollNo - s.rollNo;
}

:-のみsignが重要であるため、を返すために実際にブロックCollections.sortは必要ありません。違いを返すだけです。それで全部です。if-else-1, 0, or 1


PS:-

ハッシュコードの実装は非常に貧弱です。すべてのインスタンスを同じバケットに配置します。

@Override
public int hashCode(){
    return 1;  // All the instances will have the same hashcode.
}

理想的には、これらの属性のみhashCodeを使用して、2つのインスタンスを比較するために使用した属性を計算する必要がありますrollNo

したがって、単に値を返すのではなく、と1を考慮してハッシュコードを計算する方程式をいくつか持つことができます。rollNolarge prime number

Effective Java - Item#9このトピックの詳細については、こちらをご覧ください。


これで、コードが正常に機能しているので、2番目の疑問に移りましょう。

equalsおよびhashCodeメソッドは、中に使用される2つのオブジェクトを比較する場合は使用されませんsorting。後でインスタンスが別のインスタンスと等しいかどうかを確認するために、メソッドequalsをオーバーライドします。hashCodeしたがって、メソッドは、広告メソッドcompareToを使用したかどうかには関係ありません。また、名前から2つの方法が何をするのか、そしてそれらが関連しているかどうかを推測することもできます。equalshashCode

さらに、メソッドはクラスでequals定義されますが、メソッドはインターフェイスで宣言されます。したがって、それらは相互に関連していません。ObjectcompareToComparable

これらのメソッドのドキュメントを確認してください:- Object#equals、、Object#hashCodeおよびComparable#compareTo

于 2012-10-30T11:01:53.723 に答える
0

この実装は推奨に近いと思います:

@Override
public int compareTo(Object other) {
    if(other == null || !(other instanceOf student)){
       throw new IllegalArgumentException();
    }
    student s = (student) other;
    if(this.rollNo > s.rollNo){
         return 1;
    } else if (this.rollNo < s.rollNo){
         return -1;
    } else {
         return 0;
    }
}
于 2012-10-30T11:10:40.470 に答える
0

Comparable インターフェイスを使用している場合、compareTo() メソッドは比較不等式メソッドを返す必要があります。Google の比較可能な例です。

このリンクを確認してください

于 2012-10-30T11:11:05.220 に答える
0

- 1 つの属性のみに基づいて並べ替えたい場合は、java.lang.Comparable<T>Interface と一緒に使用しCollections.sort(List l)ます。

-しかし、目的が複数の属性に基づいてソートすることである場合はjava.util.Comparator<T>Collections.sort(List l, Comparator c).

例えば:

import java.util.Comparator;

public class Fruit implements Comparable<Fruit>{

    private String fruitName;
    private String fruitDesc;
    private int quantity;

    public Fruit(String fruitName, String fruitDesc, int quantity) {
        super();
        this.fruitName = fruitName;
        this.fruitDesc = fruitDesc;
        this.quantity = quantity;
    }

    public String getFruitName() {
        return fruitName;
    }
    public void setFruitName(String fruitName) {
        this.fruitName = fruitName;
    }
    public String getFruitDesc() {
        return fruitDesc;
    }
    public void setFruitDesc(String fruitDesc) {
        this.fruitDesc = fruitDesc;
    }
    public int getQuantity() {
        return quantity;
    }
    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public int compareTo(Fruit compareFruit) {

        int compareQuantity = ((Fruit) compareFruit).getQuantity(); 

        //ascending order
        return this.quantity - compareQuantity;

        //descending order
        //return compareQuantity - this.quantity;

    }

    public static Comparator<Fruit> FruitNameComparator 
                          = new Comparator<Fruit>() {

        public int compare(Fruit fruit1, Fruit fruit2) {

          String fruitName1 = fruit1.getFruitName().toUpperCase();
          String fruitName2 = fruit2.getFruitName().toUpperCase();

          //ascending order
          return fruitName1.compareTo(fruitName2);

          //descending order
          //return fruitName2.compareTo(fruitName1);
        }

    };
}
于 2012-10-30T11:04:51.493 に答える