2016-09-17 9 views
1

私は問題のセットでは、比較可能なインターフェイスを使用して自分のデフォルトの並べ替え順序を構築することです。 (int eid,String ename)eidに基づいて降順で並べ替える必要があります。だからこれは私がcomapreToメソッドで理解できなかったロジックでした。ソートのjava同等のインターフェイス

public class First implements Comparable<First> { 

private final int eId; 
private final String eName; 

public First(int eId, String eName){ 
    this.eId = eId; 
    this.eName = eName; 
} 

public int getEId() { 
    return eId; 
} 

public String toString(){ 
    return eName + "------" + eId; 
} 

public int compareTo(First obj){ 
    int eId1 = this.eId; 
    First f = (First) obj; 
    int eId2 = f.eId; 
    if (eId1 < eId2){ 
     return -1; 
    } else if (eId1 > eId2){ 
     return +1; 
    } else { 
     return 0; 
    } 
}} 

これはどのように機能し、他の実装方法がありますか?

答えて

2

私はあなたが私はあなたがまだその端には明らかではないかもしれません推測する「それがどのように機能するか」尋ねるあなたの質問の一部に理解を表明見ていないとして。私は、答えの中のあなたのコメントにも基づいて、コードの背後にある「論理」を理解していないことを知っています。

compareToを実装するための適切な方法であると私が信じているように、Mark Rotteveelの例を論理的に説明します。

public int compareTo(First other){ 
if (eId < other.getEId()){ 
    return -1; 
} else if (eId > other.getEId()){ 
    return +1; 
} else { 
    return 0; 
} 
} 

我々はタイプFirstの対象となるパラメータのメソッドcompareToテイク持っている - あなたが作成したクラスです。この型には、このクラスに含まれているすべてのプロパティが含まれます(たとえば、getEIdメソッドを使用すると、クラスFirst内にあるプライベートグローバル変数eIdを返すことができます)。

は今、事は compareToでこの otherパラメータは、それが 自身Firstオブジェクトのインスタンスはなく、あなたが compareToメソッド内(: if (eId < other.getEId())この部分)と比較されているものと同じですです。 compareToメソッド内

我々はcompareToメソッドに引数として渡されたFirstオブジェクト用に作成されたeIdに(あなたの現在のグローバル変数eIdをいう)eIdかどうかを確認するためのif-else文を使用します。したがって、これらの2つは同じ値ではないです。

public First(int eId, String eName){ 
this.eId = eId; 
this.eName = eName; 
} 

あなたは、その後のような2つの異なるFirstオブジェクトを行うことができます:

あなたはそれのプログラミングと思うこのように新しいしていると述べたよう

は、あなたがコンストラクタを持つクラスFirstを作りましたこの例では

First obj1 = new First(5, "Object 1"); 
First obj2 = new First(12, "Object 2"); 

obj1obj2ない同じオブジェクト、及びinherentlありますyは異なるeId値を持っています。 compareToメソッドに渡したものは、例えば、obj2である可能性があります。これは現在比較しているものとは異なります。

我々はこのcompareTo(obj2)のようにメソッドにobj2を渡すときに、これはother.getEIdを読み取るコードの一部に到達したとき、それは明らかに、if文の内側にeIdとは異なるeIdを返すことになるobj2.getEIdを実行することを意味します。この例では、 'obj2.getEId'は整数12を返します。これは、eIdobj2の12として設定しているためです。

コードの残りの部分eId現在、return -1、整数の面であまり価値があると比較されている場合else ifに上下に移動したりするreturn +1その大きなのif-else文は、非常に簡単ですでeIdに従って並べ替えます。他の場合は0を返します。その場合、それらはeIdという点で等しくなるからです。

compareTo内で比較されたeIdのインスタンスがどのように異なるのかについて、コードを少し明確にしたいと考えています。

1

equalsメソッドと==!=演算子は、等価/不等式をテストしますが、相対値をテストする方法は提供していません。いくつかのクラス(例えば、Stringや自然順序付けを伴う他のクラス)は、compareToメソッドを定義するComparableインタフェースを実装します。 Collections.sort()またはArrays.sort()メソッドで使用する場合は、クラスにComparable<T>を実装することをお勧めします。あなたの比較方法が欠けている

1

は、適切な例は次のようになります。

public int compareTo(First other){ 
    if (eId < other.getEId()){ 
     return -1; 
    } else if (eId > other.getEId()){ 
     return +1; 
    } else { 
     return 0; 
    } 
} 

Comparableインタフェースを入力することで、比較されます、データの種類を伝えることができます。これにより、適切な比較が保証されます。あなたの例は、実際にNullPointerExceptionに入る可能性があります。

+0

私はあなたのopの炎を取り除きました。それは質問に答えなかったし、あなたの実際の答えから気をそらすように役立つだけです。将来的には、質問の不備を指摘するためにコメントを使用し、[すばらしい]ことを覚えておいてください(http://stackoverflow.com/help/be-nice)。 –

+0

次回はコードを編集してくれてありがとうございます。プログラミング初心者の方は、あなたのロジックの仕組みを説明してください。 – Digs

1

私は、リストをソートするために、同等のインタフェースを実装する必要がないのはなぜ

、私はあなたの質問は基本的にあると思い、これは

をどのように動作するかを説明してください?

リストをソートするには、まずJavaに2つのオブジェクトの比較方法を伝える必要があります。こうすることで、Javaはどのオブジェクトが「少ない」か「より大きい」かを把握することができます。この情報を使用して、リストを昇順または降順で並べ替えることができます。

どのようにJavaの方が大きくてどれが少ないかを教えてください。

thisother引数より大きい場合は、1を返します。thisother引数より小さい場合は-1を返します。それ以外の場合は0を返します。

実装方法は他にありますか?

実際には、現在のcompareToメソッドはコンパイルされません。より高度な実装は次のようになります。

public int compareTo(First other){ 
    return Integer.compare(this.getEId(), other.getEId()); 
} 
+0

'this'と' other'はどちらも同じ変数を呼び出していますか? – Digs

+0

うん。 'this'と' other'の両方で 'getEId'を呼び出します。次に、Integer.compareを使用して戻り値を比較します。 @Digs – Sweeper

+0

私の答えがあなたの質問に答えると思うなら、そのチェックマークをクリックすることでそれを受け入れることを検討してください。 @Digs – Sweeper

関連する問題