0

2 つの主要な属性を持つデータ セットを維持したいと考えています。遅くなる可能性があります。より具体的な例として、各ユーザーが一意の ID (int) と一意のユーザー名 (文字列) を持つ一連のユーザー データがあります。私はユーザーを追加したり削除したりします。時には、人間が読めるアルファベット順に並べ替えられたリストをユーザーに生成したい場合もありますが、ユーザーの数が増えると、データの並べ替えに必要な時間も長くなります。

これをどのように構成しますか?私が考えることができる唯一の合理的なアプローチは、2 つの別個のデータ構造を作成し、同時に両方の構造に重複して項目を追加/削除することです。データが大きくなると、単一の構造よりも多くのデータが使用されます。後でコードに追加するために戻ったときに、両方の構造に操作を複製することを忘れないようにする必要があるため、この方法でさらにバグを導入する可能性もあります。言い換えれば、私は持つことができます:

TreeMap<String,Integer> nameSortedMap = new TreeMap<String,Integer>(String.CASE_INSENSITIVE_ORDER);

Map<Integer,String> idMap = new HashMap<Integer,String>();

データを追加または削除するときはいつでも、両方のマップで行います。ID でユーザー名を取得する場合は、idMap.get(id) または idMap.contains(id) を呼び出します (ユーザーが存在するかどうかを確認するため)。一方、並べ替えられたリストを表示する必要がある場合は、nameSortedMap.keySet() を使用します。これは、並べ替えられたリストが必要になるたびに追加の作業を行う必要がないように、既に名前順に並べられている必要があります。

私の思考プロセスはどうですか?これを達成するためのより良い、またはより簡単な方法はありますか? ありがとうございました!

4

2 に答える 2

3

私が考えることができる2つの方法があります:

  • データベースを使用し、両方の列にインデックスを付けます。データベースは高速で、非常に小さい場合もありますが ( SQLiteを参照)、データを保存する必要がない場合や、これだけを使用する場合は、おそらくやり過ぎです。
  • 上記の両方のマップを含むクラスを作成し、すべての挿入と削除を処理します。そうすれば、両方で操作を行うことを覚えておく必要がある場所が 1 か所だけになります。これは、オブジェクト指向プログラミングの主要なセールス ポイントの 1 つです。
于 2013-06-12T04:21:06.917 に答える
0

順序付きリストをあまり頻繁に呼び出さない場合は、2 つのマップを保持する必要はないと思いますが、そうしたい場合は. HashMap を拡張する 1 つのクラスを作成し、両方のマップを処理するメソッドを実装することをお勧めします。例:

public class UserMap extends HashMap<Integer, String> {

    TreeMap<String, Integer> nameSortedMap = new TreeMap<String, Integer>(String.CASE_INSENSITIVE_ORDER);

    @Override
    public String put(Integer key, String value) {
        String put = super.put(key, value);
        nameSortedMap.put(value, key);
        return put;
    }

    @Override
    public String remove(Object key) {
        String toRemove = get(key);
        if (toRemove != null) {
            remove(key);
            getOrderedName().remove(toRemove);
        }
        return toRemove;
    }

    public Set<String> getSortedNames() {
        return nameSortedMap.keySet();
    }

}
于 2013-06-12T04:35:44.860 に答える