私は配列について学んでおり、基本的には姓、名、およびスコアを収集する配列を持っています。
リストをアルファベット順でアルファベット順にソートできるように、姓と名を比較する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
の使用方法のみを示しています。
これは文字列を比較する正しい方法です:
_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;
_
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つずつソートします。
@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())
そうでない場合、名の比較を返します。
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());
}
ここで、通常の方法と同じように、メソッドからの正と負の戻り値をテストします。
乾杯
あなたはほとんどそこにいます。
最初の数行は、姓と比較して順調に進んでいます。 stringのcompareTo()メソッドは、文字列に対しては前にアルファベット順で負の数を返し、後にアルファベット順には正数を返します。
今、あなたはあなたの名前とスコアに対して同じことをする必要があります。
つまり、姓1 ==姓2の場合、次に名前の確認に進みます。名が同じ場合は、次にスコアを確認してください。 (if/thenブロックのネストについて考えてください。)
Comparator
をObject
にキャストしないように、ジェネリックを使用する here で説明されているStudent
インターフェイスの使用を検討してください。
Eugene Retunskyが言ったように、あなたの最初の部分はString
sを比較する正しい方法です。また、lastName
sが等しい場合、firstName
sを比較するつもりだったと思います。その場合は、compareTo
を同じように使用します。
任意のクラスで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);
}
}
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;
}
文字列はJavaのオブジェクトです。
あなたはそのように比較することができます、
if(this.lastName.compareTo(s.getLastName() == 0)//last names are the same