web-dev-qa-db-ja.com

オブジェクトを比較するcompareToメソッドを作成するにはどうすればよいですか?

私は配列について学んでおり、基本的には姓、名、およびスコアを収集する配列を持っています。

リストをアルファベット順でアルファベット順にソートできるように、姓と名を比較するcompareToメソッドを作成する必要があります。名。

私の本の情報はすべて、オブジェクトや文字列ではなく、数値を比較しているため、私は混乱しています。

これが私がこれまでにコーディングしたものです。私はそれが間違っていることを知っていますが、少なくとも私が何をしていると思うかを説明しています:

public int compare(Object obj) // creating a method to compare 
{   
    Student s = (Student) obj; // creating a student object

    // I guess here I'm telling it to compare the last names?
    int studentCompare = this.lastName.compareTo(s.getLastName()); 

    if (studentCompare != 0)
        return studentCompare;
    else 
    {
        if (this.getLastName() < s.getLastName())
            return - 1;

        if (this.getLastName() > s.getLastName())
            return 1;
    }
    return 0;
}

<および>シンボルは間違っていますが、私が言ったように、私の本はcompareToの使用方法のみを示しています。

29
Jeremy B

これは文字列を比較する正しい方法です:

_int studentCompare = this.lastName.compareTo(s.getLastName()); 
_

これはコンパイルさえしません:

_if (this.getLastName() < s.getLastName())
_

代わりにif (this.getLastName().compareTo(s.getLastName()) < 0)を使用してください。

拳と姓の順序を比較するには、次が必要です。

_int d = getFirstName().compareTo(s.getFirstName());
if (d == 0)
    d = getLastName().compareTo(s.getLastName());
return d;
_
24
Eugene Retunsky

CompareToメソッドの説明は次のとおりです。

このオブジェクトと指定されたオブジェクトの順序を比較します。このオブジェクトは指定されたオブジェクトより小さい、等しい、または大きいため、負の整数、ゼロ、または正の整数を返します。

ジェディスを年齢別に比較したいとしましょう。

class Jedi implements Comparable<Jedi> {

    private final String name;
    private final int age;
        //...
}

次に、ジェダイが提供されたジェダイよりも古い場合は正を返さなければならず、同じ年齢であれば0を返し、ジェダイが若い場合は負を返します。

public int compareTo(Jedi jedi){
    return this.age > jedi.age ? 1 : this.age < jedi.age ? -1 : 0;
}

compareToメソッド(Comparableインターフェースから来る)を実装することにより、自然順序と呼ばれるものを定義しています。 JDKのすべてのソート方法は、この順序を使用しますデフォルト

プリミティブ型ではなく、他のオブジェクトを比較したい場合があります。たとえば、名前に基づいてジェディスを共謀します。この場合、比較されるオブジェクトが既にComparableを実装している場合、compareToメソッドを使用して比較を行うことができます。

public int compareTo(Jedi jedi){
    return this.name.compareTo(jedi.getName());
}

この場合、より簡単になります。

ここで、名前と年齢の両方を比較基準として使用することを意図した場合、比較の順序、つまり優先順位を決定する必要があります。たとえば、2つのJedisに同じ名前が付けられている場合、その年齢を使用して、どちらが最初になり、どちらが2番目になるかを決定できます。

public int compareTo(Jedi jedi){
    int result = this.name.compareTo(jedi.getName());
    if(result == 0){
        result = this.age > jedi.age ? 1 : this.age < jedi.age ? -1 : 0;
    }
    return result;
}

ジェディスの配列があったら

Jedi[] jediAcademy = {new Jedi("Obiwan",80), new Jedi("Anakin", 30), ..}

あなたがしなければならないのは、クラスに尋ねるJava.util.Arraysソート方法を使用します。

Arrays.sort(jediAcademy);

この Arrays.sortメソッドは、compareToメソッドを使用して、オブジェクトを1つずつソートします。

18
Edwin Dalorzo

@milkplusvellocetを聞いてください。クラスにもComparableインターフェイスを実装することをお勧めします。

他の人の答えに貢献するだけです:

String.compareTo()は、文字列の違いを示します。

例えばSystem.out.println( "Test".compareTo("Tesu") );は-1を出力し、System.out.println( "Test".compareTo("Tesa") );は19を出力します

このタスクに対するオタクでマニアックな1行のソリューションは次のようになります。

return this.lastName.equals(s.getLastName()) ? this.lastName.compareTo(s.getLastName()) : this.firstName.compareTo(s.getFirstName());

説明:

this.lastName.equals(s.getLastName())は、姓が同じかどうかを確認しますthis.lastName.compareTo(s.getLastName())はいの場合、姓の比較を返します。 this.firstName.compareTo(s.getFirstName())そうでない場合、名の比較を返します。

2
Khôi

if (s.compareTo(t) > 0)は、文字列sと文字列tを比較し、必要なint値を返します。

    public int Compare(Object obj) // creating a method to compare {   
        Student s = (Student) obj; //creating a student object

        // compare last names
        return  this.lastName.compareTo(s.getLastName());    
    }

ここで、通常の方法と同じように、メソッドからの正と負の戻り値をテストします。

乾杯

1
RyanS

あなたはほとんどそこにいます。

最初の数行は、姓と比較して順調に進んでいます。 stringのcompareTo()メソッドは、文字列に対しては前にアルファベット順で負の数を返し、後にアルファベット順には正数を返します。

今、あなたはあなたの名前とスコアに対して同じことをする必要があります。

つまり、姓1 ==姓2の場合、次に名前の確認に進みます。名が同じ場合は、次にスコアを確認してください。 (if/thenブロックのネストについて考えてください。)

1
Jonathan B

ComparatorObjectにキャストしないように、ジェネリックを使用する here で説明されているStudentインターフェイスの使用を検討してください。

Eugene Retunskyが言ったように、あなたの最初の部分はStringsを比較する正しい方法です。また、lastNamesが等しい場合、firstNamesを比較するつもりだったと思います。その場合は、compareToを同じように使用します。

1
darrengorman

任意のクラスでComparableインターフェイスのcompare Toメソッドを使用する場合。これを使用して、文字列を辞書式に配置できます。

public class Student() implements Comparable<Student>{

public int compareTo(Object obj){
if(this==obj){
    return 0;
}
if(obj!=null){
    String objName = ((Student)obj).getName();
    return this.name.comapreTo.(objName);
}
}
0
VISHAL SINGH

Object型パラメーターはありません。常に型がStudentであることがわかっていれば、Studentにキャストしても意味がありません。

説明に関しては、「結果== 0」は姓が同じ場合にのみ発生し、その時点で名を比較して代わりにその値を返します。

public int Compare(Object obj)
{       
    Student student = (Student) obj;
    int result = this.getLastName().compareTo( student.getLastName() );

    if ( result == 0 )
    {
        result = this.getFirstName().compareTo( student.getFirstName() );
    }

    return result;
}
0
Jonathan Payne

文字列はJavaのオブジェクトです。

あなたはそのように比較することができます、

if(this.lastName.compareTo(s.getLastName() == 0)//last names are the same
0
ChadNC