我有一个搜索我的数据库并从条形表中获取所有值的方法。获取返回的行并转换为条形对象并从条形创建库存对象。 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]}
答案 0 :(得分:0)
您正在寻找multimap。 Java中没有标准的多图。
Oracle的Map tutorial中描述了一个解决方案,并使用了一个值为列表的Map。
另一种方法是使用另一个项目提供的Multimap。 Apache Commons和Guava是两个提供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
}
}