0

私はほとんどすべてを試しましたが、リストを自分で並べ替えることができないようです。ここにいくつかのコードがあります:

private List<Person> names = new ArrayList<Person>(); 
private Map<Integer, Person> peopleMap = new TreeMap <Integer, Person>();
for(int i = 0; i<20; i++)
        {
        Person personOne = new Person();
        peopleMap.put(personOne.id,personOne);
        names.add(personOne);
        }
        Collections.sort(names);
        run();
    }



My Person class:
public class Person implements Comparable {
    public String name;
    public int id;
    public Date birthdate;
    static int idRecord = 0;

値はランダムで埋められます。私の日付には日付形式があります。

また、個人クラス内に toString メソッドがありますが、何らかの理由でマップを印刷しようとすると、ハッシュコード (これはハッシュコードですよね?) Person@a62fc3 が表示されます。ここに私の toString が人のクラス内にあります:

             public String toString()
    {

        char tab = '\t';
        return ("ID Number: "+id+tab+" Name: "+tab+name+tab+" Birthdate: "+(birthdate.toString()));

    }

person クラス内で toString メソッドを呼び出すことができないことを付け加えておきます。Person@a62fc3 を印刷しているためです。

public void sortByID()
{
    char tab = '\t';

    for (int i = 1; i<20; i++)
    System.out.println((peopleMap.get(i)).toString());
    //System.out.println("ID Number: "+(peopleMap.get(i).id)+tab+" Name: "+tab+peopleMap.get(i).name+tab+" Birthdate: "+peopleMap.get(i).birthdate);
    run();

}

コメント化されたコードは機能しますが、toString を呼び出すコードは本来あるべきものを出力しません

私の Person クラス内のメソッドと比較してください。

public int compareTo(Object obj) {
 Person o = (Person) obj; 
if (this.id == o.id) { return 0; }
 if (this.id > o.id) { return 1; } 
if (this.id < o.id) { return -1; } 
return 0;

必要に応じて、さらにコードを提供できます。

名前メソッドで比較し、出力します。値を格納するための arrayList を作成し、その中で並べ替える必要がありますか?

    public void sortByName()
    {
//      char tab = '\t';

        for(int j = 1; j<20; j++)
        {
//          System.out.println("ID Number: "+(names.get(j).id)+tab+" Name: "+tab+peopleMap.get(j).name+tab+" Birthdate: "+peopleMap.get(i).birthdate);
            //Person p = names.get(j);
            System.out.println(names.get(j).toString());
        }
    }

出力: Person@10b30a7 Person@1a758cb Person@1b67f74 Person@69b332 Person@173a10f Person@530daa Person@a62fc3 Person@89ae9e Person@1270b73 Person@60aeb0 Person@16caf43 Person@66848c Person@8813f2 Person@1d58aae Person@83cc67 Person1@e09 Person@de6f34 Person@156ee8e Person@47b480

ありがとう

4

4 に答える 4

0

正確な問題を特定することはできません。いくつかの提案があります。

マップはソートされていません。

通常、 anMapはソートされないため、マップのキーをソートすることはできません。並べ替えたい場合は、インターフェースMapを使用してください。SortedMap

可能であればジェネリックを使用する

Comparableインターフェイスは汎用です。あなたはおそらく実装しているはずですComparable<Person>

次に、compareTo()メソッドは次のようになります。

public int compareTo(Person p) {
    if (this.id > p.id) return 1;
    else if (this.id < p.id) return -1;
    else return 0;
}

Comparator<Person>との違いComparable<Person>

Comparatorインターフェイスだけでなく、インターフェイスも確認する必要がありComparableます。
あなたPersonは、通常、人をソートしたいように、同等のものを実装する必要があります。次に、 の実装をいくつか書く必要がありComparatorます。

public classPersonNameComparator implements Comparator<Person> {

    public int compare(Person p1, Person p2) {
        return p1.name.compareTo(p2.name);
    }
}

@Overrideアノテーションを使用することの重要性

スーパー クラスのメソッドをオーバーライドしたり、インターフェイス メソッドを実装したりする場合は常に @Override アノテーションを使用することが重要です。以下は、これが良いアイデアである理由に関するいくつかのリンクです。

于 2010-07-19T19:55:34.547 に答える
0

参照: コンパレータ API。

「一連の要素 S に Comparator c によって課される順序付けは、(compare((Object)e1, (Object)e2)==0) が e1 と同じブール値を持つ場合に限り、equals と一致すると言われます。 S 内のすべての e1 および e2 に対して equals((Object)e2) となります。"

Person クラスに equals メソッドがありません。equals のデフォルトの実装では、同一性が比較されます。equals をオーバーライドする場合は、hashCode 2 を定義する必要があります。

そして、この質問: Consistent Equals() results, but inconsistent TreeMap.containsKey() result

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


public class Person implements Comparable<Person> { 
    public final String name;
    public final int id;
    public final Date birthdate;

    public Person(int id, String name, Date birthdate) {
        this.id = id;
        this.name = name;
        this.birthdate = birthdate;
    }

    public static void main(String[] args) {    
        List<Person> list = new ArrayList<Person>();
        for (int i = 10; i > 0; i--) {
            list.add(new Person(i, "name" + String.valueOf(i), new Date()));
        }
        System.out.println(list);
        Collections.sort(list);
        System.out.println(list);
    }

    @Override
    public boolean equals(Object other) {
        if (!(other instanceof Person)) {
            return false;
        }
        return this.id == ((Person)other).id;
    }

    @Override
    public int hashCode() {
        return 41 * id;
    }

    @Override
    public String toString() {
        return "Person<" + id + ">";
    }

    @Override
    public int compareTo(Person other) {
        if (!(other instanceof Person)) {
            throw new IllegalArgumentException();
        }
        return this.id - ((Person)other).id;
    }
}

出力:

[Person<10>, Person<9>, Person<8>, Person<7>, Person<6>, Person<5>, Person<4>, Person<3>, Person<2>, Person<1>]
[Person<1>, Person<2>, Person<3>, Person<4>, Person<5>, Person<6>, Person<7>, Person<8>, Person<9>, Person<10>]
于 2010-07-19T21:33:15.290 に答える
0

@Override メソッドを使用して、実際に toString メソッドをオーバーライドしていることを確認しましたか? デフォルトの toString() (つまり、オブジェクトへのポインターの値) を出力しているようです。

于 2010-07-19T20:32:52.320 に答える
0

私が目にする 1 つの問題は、値ではなくキーTreeMapでソートすることです。これはマップ内の値であるため、ツリーのソートには使用されません。マップのキーは ID であるため、ツリー内のアイテムは人物の ID でソートする必要があります。compareTo

マップがソートされていないことをどうやって知ることができますか? そうでないことを示す出力をいくつか示してもらえますか? ひょっとして の ID をPersonマップに配置した後で変更していませんか?

ああ、そして何とnames比較されpersonMapますか?また、IDは1から始まって本当に連続していますか? このコードは何を吐き出しますか:

for (Person person : peopleMap.values()) {
    System.out.println(person);
}
于 2010-07-19T19:59:03.140 に答える