Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

よいソート方法を教えてください。

現在Vector<Hashtable<String,String>>をHashtableの任意の
キーに対する値についてソートしたいと考えています。
バブルソート・クイックソート・マージソートくらいしか知
らないのですが、それ以外でもいいのでできれば効率が良く
て難しくないソート方法があれば教えてください。

5

回答

81731

閲覧

5件の回答

評価

0

質問の回答としてずれてるかもしれませんが、ソートするだけならJavaに
用意されているものを使ってみてはいかがでしょうか?
Stringの集合が配列ならjava.util.Arrays#sortで、
リストならjava.util.Collections#sortでソートできます。
また文字列が重複しないのであればHashtableから取り出して
java.util.TreeSetに加えていく方法も使えます。
ソートの速さが重要な場合は以下のサイトが参考になるかもしれません。

自作のクイックソートでJava.util.Arrays.sortと競ってみた
http://tmken2.blog95.fc2.com/blog-entry-2.html

評価

0

ソートしたいのはVectorの中身、Hashtableの順番だろう。
Hashtableそのもので比較できないので、
Collections.sort(List,Comparator)だな
自前でソートしてもいいが、大抵の場合有意な差にはならな
い。
もっと重要な箇所に時間を割くべきだし、コードを簡潔に保
つという意味でも、標準ライブラリが望ましい。

しかし、今のご時世こんなクラスで質問するってことは、過
去のコードの保守だろうか。

評価

0

Comparatorを実装してみました。
equalsと一貫性はないのでTreeSetやTreeMapでは使えませんがCollections#sortなら問題ありません。
vectorはVector<Hashtable<String, String>>オブジェクトとして

StrStrMapComparator c = new StrStrMapComparator();
c.setKey("any-key");
Collections.sort(vector, c);

で"any-key"をキーとする値でvectorがソートされます。
キーがない場合や値がnullの場合は順位は後ろになります。

import java.util.Comparator;
import java.util.Map;

public class StrStrMapComparator implements Comparator<Map<String, String>> {
    private String key = "";

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        if (key == null) {
            throw new IllegalArgumentException("the key must not be null!");
        }
        this.key = key;
    }

    @Override
    public int compare(Map<String, String> o1, Map<String, String> o2) {
        String s1 = o1.get(key);
        String s2 = o2.get(key);
        if (s1 == null) {
            if (s2 == null) {
                return 0;
            }
            return 1;
        }
        if (s2 == null) {
            return -1;
        }
        return s1.compareTo(s2);
    }
}

評価

0

なんでわざわざHashtable→Mapに変えたんだろう。
仮に変えるならvectorもlistだろうな。

>            throw new IllegalArgumentException("the 
key must not be null!");
Mapに変えたならキー==nullは通していいと思うが。

あとは…キー付きのコンストラクタもあると、使い勝手い
いかもね。

評価

0

質問者です。

>しかし、今のご時世こんなクラスで質問するってことは、過去のコードの保守だろうか。

私が使っているクラスは古いんですね。
ほとんど独学でやっていて、私はあまり今どきを知らないもので・・・。
Collections#sort(List<?> list)は知っていて、そういうのを拡張したものを実装してみようとソースを見ては見ましたが仕組みがよくわからず、クイックソートか何かを自前で実装すればいいと思っていました。

Collections#sort(List<T> list,Comparator<? super T> c)にソート基準となるComparatorを用意すればいいんですね。
作ってくださったStrStrMapComparatorなどを参考にしてみます。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。