1

Student オブジェクトの arrayList があります。すべてのオブジェクトには、姓名、UID (大学 ID 番号) GPA などの共通のプロパティがあり、大学院と学部のサブクラスがあります。私は、UID番号に基づいて配列リストを最低から最高の順にソートする方法について困惑しています。UID 番号は、U123456 の形式の STRING です。常に U があり、さまざまな量の整数があります。U のため、int に解析してそのように並べ替えることができません。Comparatorクラスが使用されているのを見てきましたが、2 つのオブジェクトしか比較していないように見えるため、理解できません。クラスComparatorがこれで機能する場合、誰かがそれが何をどのように機能するかを説明してもらえますか?

4

4 に答える 4

3

この動作により、比較は簡単です。

System.out.println("u1".compareTo("u2")); // -1
System.out.println("u2".compareTo("u2")); // 0
System.out.println("u3".compareTo("u2")); // 1
System.out.println("u4".compareTo("u2")); // 2

したがって、これはあなたがする必要があることです:

  • ... http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.htmlStudent implement Comparableを見ることができます
  • compareTo(Student s)Student で定義します。return(this.id.compareTo(s.id));
  • ArrayList で sort() を呼び出すだけです
于 2012-11-25T05:25:06.907 に答える
1

すでに述べたように、 Comparer クラスを使用することもできます。

Student クラスから Comparator クラスを実装する場合は、ロジックを指定できる比較メソッドの実装を提供する必要があります。Collections.sort(list, comparison) メソッドを実行すると、このメソッドが呼び出されます。さらに、それがどのように呼び出されているかを確認するためだけに、compare メソッドにデバッグ ポイントを配置できます。

問題の完全な例は次のとおりです。

import java.util.Comparator;
public class Student implements Comparator<Student>{

private String uid;

@Override
public int compare(Student o1, Student o2) {

Integer i1 =  Integer.parseInt(o1.getUid().substring(1)); // Skip the first character U
Integer i2 = Integer.parseInt(o2.getUid().substring(1));  // Skip the first character U
if(i1 > i2 ){
    return 1;
}else if(i1< i2){
    return -1;
}else {
    return 0;
}
}

public String getUid() {
    return uid;
}

public void setUid(String uid) {
    this.uid = uid;
}

}



package test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestSort {

public TestSort(){

Student s1 = new Student();
s1.setUid("U34334");

Student s2 = new Student();
s2.setUid("U64454");

Student s3 = new Student();
s3.setUid("U13344");

List<Student> list = new ArrayList<Student>();
list.add(s1);
list.add(s2);
list.add(s3);


Collections.sort(list, new Student());

for(Student s : list){
    System.out.println(s.getUid());
}

}

public static void main(String[] args){
new TestSort();
}

}
于 2012-11-25T06:33:25.580 に答える
0

これを試して :

ArrayList lsStudent = GetStudentData();

lsStudent.Sort((S1, S1) => Convert.ToInt32(S1.UID.Substring(1))
                          .CompareTo(Convert.ToInt32(S2.UID.Substring(1))));

これで問題が解決します。

于 2012-11-25T05:25:27.890 に答える
0

インターフェイスを実装するStudentクラスを作成します。Comparable

     public class Student implements Comparable<Student> {

以下のようにクラスにcompareToメソッドを実装します。Student

@Override
public int compareTo(Student s) {
   return UID.compareToIgnoreCase(s.UID);
}

ここでUID.compareToIgnoreCase(s.UID)は、並べ替えのために英数字の値を比較します。

次に、単にCollections.sort学生オブジェクト コレクションを並べ替えるために使用します。

于 2012-11-25T05:25:41.063 に答える