【问题标题】:Adding multiple values (List) with single key in map在地图中使用单个键添加多个值(列表)
【发布时间】:2014-04-28 07:52:09
【问题描述】:

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

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&lt;Stock, List&lt;Bar&gt;&gt;

预期输出

{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]}

【问题讨论】:

    标签: java collections map multimap


    【解决方案1】:

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

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

    另一种方法是使用另一个项目提供的 Multimap。 Apache CommonsGuava 是两个提供多图的流行项目。

    【讨论】:

      【解决方案2】:

      您可能可以使用 TreeMap,它是一个排序的地图。 (按元素的自然顺序排序),它允许您定义自定义排序顺序(通过 Comparable 或 Comparator),集合的键(Stock 对象)也必须实现可比较接口。

      【讨论】:

        【解决方案3】:

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

        我会争辩说,当您最终为这种简单的情况使用复杂的地图时,您很可能试图逃避创建一个简单的对象。当您需要聚合另一条数据时,这可能会导致您遇到一些奇怪的事情。

        通过创建一个新类,它还允许您稍后提高可读性,例如,如果您需要对给定的Stock 求和所有Bars:

        /**
         * 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
           }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-21
          • 2019-02-19
          • 2016-05-25
          • 2015-07-14
          • 2015-12-20
          相关资源
          最近更新 更多