0

我有一个包含表格行数据的对象列表。该表中有多个列,但我认为这不是问题。我需要应用的逻辑只需要两列。这两列称为化学名称批号。现在有趣的部分是,对于特定的批号,一种化学物质可以出现多次。例如,

化工 | 批次 | 其他栏目

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

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

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

现在我需要的是批号及其相关行。我意识到最好的方法是 HashMap,其中 K 是批号,V 是列表。现在我不确定如何将键分配给包含行对象的列表。

我希望,但我不能在数据库级别这样做,所以这是不可能的。

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

创建一个Row对象来保存您的值,然后将 a 添加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 回答
1

或者你可以只使用番石榴库。Multimap类(技术接口)可以满足您的需求:一个键映射到多个值。

您可能首先将所有Row对象放在一个列表中,然后使用该Multimaps.index方法创建一个Multimap实例。Multimaps是一个实用类,它提供了许多创建Multimap实例的方法。

您的代码可能如下所示:

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.
    }
});

从 guava api 查看更多细节。

于 2012-09-19T01:20:43.883 回答