0

テーブルの行データを含むオブジェクトのリストがあります。そのテーブルには複数の列がありますが、それは問題ではないと思います。適用する必要のあるロジックは、2つの列のみを必要とします。これらの2つの列は、化学名バッチ番号として知られています。ここで興味深いのは、特定のバッチ番号に対して化学物質が何度も発生する可能性があることです。例えば、

化学| バッチ| その他の列

A ---------------- 100 --------- ABC

A ---------------- 100 --------- GHF

A ---------------- 100 --------- GHL

ここで必要なのは、バッチ番号とそれに関連する行です。これを行う最良の方法は、Kがバッチ番号でVがリストであるHashMapであることに気付きました。行オブジェクトを含むリストにキーを割り当てる方法がわかりません。

私は望みますが、データベースレベルでこれを行うことはできないので、それは問題外です。

4

3 に答える 3

2

Map<String, List<String>>特定のキーに対して物事のリストを保存するために使用できます。

ファンシーになりたい場合は、次の匿名の実装を使用できます。

Map<String, List<String>> map = new HashMap<String, List<String>>() {

    public List<String> get(Object key) {
        List<String> list = super.get(key);
        if (list == null) { 
            list = new ArrayList<String>();
            put(key, list);
        }
        return list;
    }

}

リストがまだ存在しない場合は自動的にリストが作成されるため、次のように安全に使用できます。

map.get(key).add("new item"); // won't get a NuilPointerException


カスタマーメソッドのこのコードパターンがget()非常に便利であることがわかった場合!

于 2012-09-19T00:20:29.700 に答える
1

または、グアバライブラリを使用することもできます。ニーズに合わせてマルチマップクラス(技術的にはインターフェイス)があります。複数の値への1つのキーマッピング。

最初にすべてのRowオブジェクトをリストに入れてから、Multimaps.indexメソッドを使用してMultimapインスタンスを作成する場合があります。MultimapsMultimapは、インスタンスを作成するための多くのメソッドを提供するutilクラスです。

コードは次のようになります。

List<Row> rows = ... // all the row objects.
Multimap<String, Row> rowsMap = Multimaps.index(rows, new Function<Row, String>() {
    @Override
    public String apply(Row row) {
        return row.getRowKey(); // assume that getRowKey() return the key of one row.
    }
});

guavaapiから詳細を参照してください。

于 2012-09-19T01:20:43.883 に答える
1

Row値を保持するオブジェクトを作成してList<Row>から、マップにを追加します。

Map<String, List<Row>> map = new HashMap<String, List<Row>>();
List<Row> list = new ArrayList<Row>();
list.add(new Row(...));
list.add(new Row(...));
map.put("someKey", list);

ループで実行する必要がある場合は、次を使用します。    

Map<String, List<Row>> map = new HashMap<String, List<Row>>();
for (Row currentRow : rows) {
    String key = currentRow.getKey();
    List<Row> rows = map.get(key);
    if (rows == null) {
      rows = new ArrayList<Row>();
    }
    rows.add(currentRow);
    map.put(key, rows);
}
于 2012-09-19T00:21:06.907 に答える