-5

Comparator を使用して次のようにコードを作成し、姓に従って並べ替えました。

class Order{

    private static ArrayList<String> personlist = new ArrayList<String>();
    Iterator iter1 = personlist.iterator();
    while (iter1.hasNext()) {
        System.out.println(iter1.next());
    }
    Collections.sort(personlist, new LastnameComparator());
    Iterator iter2 = personlist.iterator();
    while (iter2.hasNext()) {
        System.out.println(iter2.next());
    }
}

class String implements Comparable {
    String firstName, lastName;
    public String(String f, String l) {
        this.firstName = f;
        this.lastName = l;
    }
    public String getFirstName() {
        return firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public String toString() {
        return "[ firstname=" + firstName + ",lastname=" + lastName + "]";
    }
    public int compareTo(Object obj) {
        String emp = (String) obj;
        int comp = firstName.compareTo(emp.getFirstName());
        return ((comp == 0) ? lastName.compareTo(emp.getLastName()) : comp);
    }
    public boolean equals(Object obj) {
        if (!(obj instanceof String)) {
          return false;
        }
        String emp = (String) obj;
        return firstName.equals(emp.getFirstName()) &&                 lastName.equals(emp.getLastName());
    }
}
class LastnameComparator implements Comparator<String> {
    @Override
    public int compare(String lastname1, String lastname2) {
        int lnameComp = lastname1.getLastName().compareTo(lastname2.getLastName());
        return ((lnameComp == 0) ? lastname1.getFirstName().compareTo(lastname2.getFirstName()) :
        lnameComp);     
    }
} 

しかし、このコードは正しく機能せず、エラーが発生します。personlist には次の名前が含まれます。

John C. Shafer
Ariel Fuxman
Roberto J. Bayardo Jr.
Alexandre V. Evfimievski
Dmitri Asonov
Kristen LeFevre

そして、次のように表示したい

Dmitri Asonov
Alexandre V. Evfimievski
Ariel Fuxman
Roberto J. Bayardo Jr.
Kristen LeFevre
John C. Shafer

このコードを修正するにはどうすればよいですか?ありがとうございます。

4

2 に答える 2

0
public int compareTo(Object obj) {
    String emp = (String) obj;
    int comp = firstName.compareTo(emp.getFirstName());
    return ((comp == 0) ? lastName.compareTo(emp.getLastName()) : comp);
}

あるべき、

public int compareTo(Object obj) {
    String emp = (String) obj;
    int comp = lastName.compareTo(emp.getLastName());
    return ((comp == 0) ? firstName.compareTo(emp.getFirstName()) : comp);
}

// クラスに String という名前を付けることも避けてください

于 2013-03-17T19:10:07.863 に答える
-2

注意次のコードのようなことをすると、世界は実際には数秒で終わります。私を責めないでください、私はあなたに警告しました。

通常Stringの s を使用して、次のようなカスタム Comparator を使用するだけです。

public class PersonComparator implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        String[] o1Data = o1.split(" ");
        String[] o2Data = o2.split(" ");
        String o1Last = o1Data[o1Data.length-1];
        String o2Last = o2Data[o2Data.length-1];
        return o1Last.compareTo(o2Last);
    }
}

名前の最後の部分を抽出して比較します。

于 2013-03-17T18:59:04.630 に答える