1

次のスキーマで互いにマップされているオブジェクトの 2 つの配列があるとします。

配列1:

String [] prog_types1 = {"Program1","Program2","Program3","Program4"};

および array2 :

String [] prog_types2 ={"SubProgram1","SubProgram2","SubProgram3","SubProgram4",  
"SubProgram5","SubProgram6","SubProgram7","SubProgram8","SubProgram9","SubProgram10"};

その名前からわかるように、prog_types2 は prog_types1 の拡張ですが、繰り返し値がいくつかあるため、これらのプログラム間の完全なマッピングは次のようになります。

prog_types1     prog_types2
ProgramType1    SubProgramType1
ProgramType1    SubProgramType2
ProgramType1    SubProgramType7
ProgramType1    SubProgramType9
ProgramType2    SubProgramType12
ProgramType2    SubProgramType7
ProgramType2    SubProgramType9
ProgramType3    SubProgramType1
ProgramType3    SubProgramType2
ProgramType3    SubProgramType21
ProgramType3    SubProgramType27
ProgramType3    SubProgramType7
ProgramType5    SubProgramType12
ProgramType5    SubProgramType9

私の質問は、より高速な処理と再利用の観点から、これらの配列を互いにマップする最良の方法は何ですか? 私はそれを次のように実装しました:

-- クラスのセット (クラス prog1 と prog2 およびそれをベクトルに入れた後)...

-- ハッシュセット付きハッシュテーブル

-- 可能なもう 1 つの配列

私が探している方法は、前に説明したすべての方法のように、prog1 オブジェクトに対して同じ prog2 オブジェクトを再度作成することではなく、たとえばインデックス位置によって、または他の方法でマップする必要があります。それを解決するための素晴らしいアルゴリズムの方法を探しているだけです...

前もって感謝します

ps 1つのパッケージ内で2つのクラス間でのみ使用する必要があり、主な用途はprog1タイプの値に基づくprog2タイプの値の母集団です

PS2 Java7

4

4 に答える 4

3

Guava Libraries のMultiMapを使用すると、次のように言えます。

Multimap<String, String> mmap = ArrayListMultimap.create();
mmap.put("Program1", "SubProgramType1");
mmap.put("Program1", "SubProgramType2");
// etc.

mmap.get("Program1")

次のようになります。

[SubProgramType1, SubProgramType2, SubProgramType7, SubProgramType9]

ところで、Hashtable はハッシュされたコレクションには現在使用されておらず、 HashMapに取って代わられています:)

于 2012-08-20T20:10:18.487 に答える
0

IMOの最善の方法は次のとおりです。

Map<String, List<String>> programs = new HashMap<String, List<String>>();

最初のリストの文字列をキーとして使用し、対応するサブプログラムが値リストを構成します。これで、マッピングは明らかです。

ProgramType1 -> [SubProgramType1, SubProgramType2, SubProgramType7, SubProgramType9]
ProgramType2 -> [SubProgramType12, SubProgramType7, SubProgramType9]
ProgramType3 -> [SubProgramType1, SubProgramType2, SubProgramType21, SubProgramType27, SubProgramType7]
ProgramType5 -> [SubProgramType12, SubProgramType9]
于 2012-08-20T19:56:54.370 に答える
0

グアバListMultimap、それはList<E>ではありませんCollection<E>- もう少し楽しいです。

private ListMultimap<String,Something> stuff = ArrayListMultimap.create();

// ...

public void add(String key, Something item) {
  stuff.put(key, item);
}

public List<Something> get(String key) {
  // might as well use the Lists convenience API while we're at it.
  return Lists.newArrayList(stuff.get(key));
}

http://www.coffee-bytes.com/2011/12/22/guava-multimaps

于 2012-08-20T20:18:28.070 に答える
0

ところで、私が必要なので:

-- Program1 の値を個別に使用する

-- SubProgram1 の値を個別に使用する

-- Program1 の値に基づいて SubProgram1 の値を入力します。

ここでの最も簡単な解決策は、すべての重複を含む 2 次元配列を宣言し (完全なマップ スキーマで表示されるように)、1) および 2) 非反復アルゴリズムを使用してそこからデータを入力し、3) 2 次元からのループ サイクルを使用することです。

したがって、3 つのオブジェクトを宣言する理由はありません。大量のメモリを節約でき、優れたアプローチです。私はそれのために自分自身に星を与えています:)

于 2012-08-21T15:00:30.187 に答える