0

2 つの配列リストがあります。1 つは、誕生日を含む配列リストです。もう 1 つは、名前の配列リストです。

を使用して、日付の配列リストを日付の降順で並べ替えています

Collections.sort(birthdayList);

名前の配列リストを、誕生日リストと同じ順序でソートしたいと考えています。

すなわち

未分類

bdaylist   namelist

1/20/1980 - Bob

3/15/1970 - Todd

8/25/1990 - Jeff

になる

ソートされた

3/15/1970 - Todd

1/20/1980 - Bob

8/25/1990 - Jeff

Javaでこれを行う最も効率的な方法は何ですか?

どうもありがとうございました!

4

4 に答える 4

8
  • 名前と誕生日の 2 つのフィールドを持つ Person クラスを作成します。
  • 人物をリストに入れる
  • 誕生日を比較するカスタム コンパレータで並べ替える
于 2012-10-22T15:46:51.847 に答える
4

次のようなクラスを作成します。

public class Person implements Comparable<Person> {

    private String name;

    private Date date;

    public Person(String name, Date date) {
        this.name = name;
        this.date = date;
    }

    public String getName() {
        return name;
    }

    public Date getDate() {
        return date;
    }

    @Override
    public int compareTo(Person o) {
        return this.date.compareTo(o.getDate());
    }
}

Person次に、次のようにオブジェクトのリストを並べ替えることができます。

public static void main(String... args) {
    LinkedList<Person> persons = new LinkedList<Person>();
    persons.add(new Person("Name1", new Date())); //Specify different dates
    persons.add(new Person("Name2", new Date()));
    persons.add(new Person("Name3", new Date()));

    Collections.sort(persons);

    //Collections.sort(persons, Collections.reverseOrder()); //Reverse order
}

それでおしまい。

または別の代替手段は、次を使用することComparatorです:

Collections.sort(persons, new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getDate().compareTo(o2.getDate());
    }
});

逆順:

Collections.sort(persons, Collections.reverseOrder(new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getDate().compareTo(o2.getDate());
    }
}));

Comparable<Person>次に、個人クラスに実装する必要はありません。

于 2012-10-22T15:52:28.413 に答える
3

2 つの配列リストを並べ替えないでください。日付と名前の両方を含む結合オブジェクトで満たされた 1 つの配列リストを並べ替えます。それが本当に唯一の方法です。

于 2012-10-22T15:46:16.637 に答える
0

コンパレータとしての実装Comparableと使用に関する他の回答はすべて実際に正しいです。でも、これも参考になれば…

Collections.sort の Javadoc によると、sort() はソートアルゴリズムとしてModified Mergesortを使用することに注意してください。間違っている場合は訂正してください。ただし、マージ ソートは、最悪のシナリオで、すべてのソート アルゴリズムの中で可能な限り最高の実行時間を達成することが広く受け入れられています: O(n log n) (私はその事実を排除していません)最悪の場合でも O(n log n) を達成する他のソートアルゴリズムがあるかもしれません)。

ただし、O(n log n) は、制限のない値のドメインに対して可能な限り最良の実行時間にすぎません。ドメインに制限がある場合は、バケット ソートを使用して O(n) の実行時間をさらに短縮できます。

于 2012-10-22T16:01:31.163 に答える