在地图中使用单个键添加多个值(List)

时间:2014-04-28 07:52:09

标签: java collections map multimap

我有一个搜索我的数据库并从条形表中获取所有值的方法。获取返回的行并转换为条形对象并从条形创建库存对象。 Bar是股票的子类。

public Map<Stock, List<Bar>> findBars() throws Exception {
        BarConverter barConverter = new BarConverter();
        List<Bar> bars = new ArrayList<Bar>();
        Map<Stock, List<Bar>> map = new HashMap<Stock, List<Bar>>();

        // get rows from db
        List<Map<String, Object>> rows = dbClient.get(tableName, null, null, "id");
        for (Map<String, Object> row : rows) {
            // get bar object from row
            Bar bar = barConverter.setData(row, market);
            bars.add(bar);

            // set stock and map containing stock & bar
            Stock stock = new Stock(bar.getTicker(), market, bar.getExchange());
            map.put(stock, bars);
        }
        // return map
        return map;
    }

目前上述方法提供了类似

的输出
{AAPL-US-NASDAQ=[AAPL,NASDAQ,2014-04-25,564.53,571.99,563.96,571.94,13000000,8.6174E8], GOOG-US-NASDAQ=[GOOG,NASDAQ,2014-04-25,1564.53,1581.99,263.96,371.94,13000000,1.6174E8], AAPL-US-NASDAQ=[AAPL,NASDAQ,2014-04-25,222.53,321.99,3121.96,571.94,13000000,8.6164E8] }

正如您在上面的输出中所看到的那样,他们首先是苹果股票的条形值,然后谷歌股票的条形值和苹果股票的一些不同的条形值。如何用一把钥匙对这两个Apple栏进行分组。即Map<Stock, List<Bar>>

预期输出

{AAPL-US-NASDAQ=[{AAPL,NASDAQ,2014-04-25,564.53,571.99,563.96,571.94,13000000,8.6174E8}, {AAPL,NASDAQ,2014-04-25,222.53,321.99,3121.96,571.94,13000000,8.6164E8}], GOOG-US-NASDAQ=[GOOG,NASDAQ,2014-04-25,1564.53,1581.99,263.96,371.94,13000000,1.6174E8]}

3 个答案:

答案 0 :(得分:0)

您正在寻找multimap。 Java中没有标准的多图。

Oracle的Map tutorial中描述了一个解决方案,并使用了一个值为列表的Map。

另一种方法是使用另一个项目提供的Multimap。 Apache CommonsGuava是两个提供Multimaps的热门项目。

答案 1 :(得分:0)

你可以使用一个TreeMap,它是一个有序的Map。 (按元素的自然顺序排序),它允许您定义自定义排序顺序(通过Comparable或Comparator),集合的键(Stock对象)也必须实现类似的界面。

答案 2 :(得分:0)

技术解决方案是使用某种“高级”地图,如其他答案中所述。

我认为,当你最终得到这些简单案例的复杂地图时,你可能会试图逃避创建一个简单的对象。当你需要聚合另一段数据时,这可能会让你产生一些奇怪的东西。

通过创建新课程,您还可以在以后提高可读性,例如,如果您需要对给定Bar的所有Stock求和:

/**
 * The simple way
 */
public class StockWithBarComposite {

   private Stock stock;

   private List<Bar> bars;

   /**
    * Some complex operation you can easily document here
    *
    * @return BigDecimal
    */
   public BigDecimal barSum() {
       // Loop, sum, whatever
   }

}