29

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

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

4

9 に答える 9

24

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

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;
于 2012-04-04T18:48:11.707 に答える
18

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人のジェダイの名前が同じである場合、年齢を使用して、どちらが最初に、どちらが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そのsortメソッドを使用するようにクラスに依頼することです。

Arrays.sort(jediAcademy);

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

于 2012-04-04T18:56:35.493 に答える
2

@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())そうでない場合は、名の比較を返します。

于 2012-04-04T19:04:34.693 に答える
1

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

通常どおり、メソッドからの正負の戻り値をテストします。

乾杯

于 2012-04-04T18:50:09.740 に答える
1

あなたはほとんどそこまで来ています。

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

次に、名前とスコアについても同じことを行う必要があります。

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

于 2012-04-04T18:50:52.983 に答える
1

へのキャストを回避できるように、ジェネリックを使用するhereComparatorで説明されているインターフェイスの使用を検討してください。ObjectStudent

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

于 2012-04-04T18:54:04.387 に答える
0

String は Java のオブジェクトです。

このように比較できますが、

if(this.lastName.compareTo(s.getLastName() == 0)//last names are the same
于 2012-04-04T18:51:47.420 に答える
0

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

説明としては、「result == 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;
}
于 2012-04-04T19:01:19.957 に答える