Java:是否有一个数据结构像多图,但接受重复键?

时间:2009-12-28 04:45:36

标签: java oop data-structures map

我有点困难。基本上我需要一个有点像数据库的数据结构。我需要能够为每个密钥提供多个数据位,并且可以使用多个具有相同名称的密钥。然后我需要能够搜索该数据结构并提取正确的关键字并与其他可能的数据进行对比。这是一个例子:

Keys   |   Name   |  Price

Airplane | Boeing | 10000
Airplane | LearJet | 4000
Airplane | Airbus | 20000
Car | Honda | 500
Car | Ford | 450
Car | Chevy | 600

所以我需要能够专门搜索波音飞机和飞机。由于很多原因我不能使用实际的数据库,因为我没有很多记录,所以它是完全矫枉过正的,但我确实需要能够提取这些值。我在Java中找到了一个multimap实现,但它不允许我插入多个具有相同名称的键,也不允许我不仅搜索键而且搜索具有相应值的键。

任何人都知道如何实施这项工作? 感谢

编辑:好的,我查看了所有的答案。我出于某种原因无法理解你需要键是唯一但你使用地图的任何情况。这个解决方案有许多答案,我因为无法理解它们而承担全部错误。 最终我需要有多个独特的密钥,我知道这些解决方案是解决方法,但我无法理解它。

虽然它远不是一个完美的解决方案,但我使用了Apache的MultiKey Class,因为我只需要提取一个可能的值就可以了。我很感激每个人的努力,不幸的是我无法让它工作。遗憾

10 个答案:

答案 0 :(得分:3)

为什么不{/ 1}}

Set<Entry>

答案 1 :(得分:3)

为什么不使用Apache Commons集合中的MultiKey

http://commons.apache.org/collections/api-3.1/org/apache/commons/collections/keyvalue/MultiKey.html

// populate map with data mapping key+name to price
Map map = new HashMap();
MultiKey multiKey = new MultiKey(key, name);
map.put(multiKey, price);

// later retireve the price
MultiKey multiKey = new MultiKey(key, name);
<Number> price = (String) map.get(price);

答案 2 :(得分:2)

您需要嵌套Map。这是一个启动示例:

Map<String, Map<String, Integer>> vehicles = new HashMap<String, Map<String,Integer>>();
Map<String, Integer> airplanes = new HashMap<String, Integer>();
vehicles.put("Airplane", airplanes);
airplanes.put("Boeing", 10000);
airplanes.put("LearJet", 4000);
airplanes.put("Airbus", 20000);
Map<String, Integer> cars = new HashMap<String, Integer>();
vehicles.put("Car", cars);
cars.put("Honda", 500);
cars.put("Ford", 450);
cars.put("Chevy", 600);

// To get price of Airplane - Airbus, just do:
Integer price = vehicles.get("Airplane").get("Airbus");

答案 3 :(得分:1)

您可以使用Map的{​​{1}}。

答案 4 :(得分:0)

在这种情况下,为什么不使用java.util.List

答案 5 :(得分:0)

你当然可以使用Java的集合来实现这一点,但这真的,真的是数据库的任务。

您是否考虑过使用嵌入式数据库?它们让您拥有DBMS的所有奢侈品而无需实际需要(它们只是一个库)。看,例如在SQLite或HSQLDb。

答案 6 :(得分:0)

为什么不使用像H2这样的嵌入式数据库。然后,您可以使用Spring中的SimpleJDBCTemplate之类的简单包装器在SQL中执行搜索。或者,您可以为对象创建ORM映射,并在映射对象上使用HQL或按示例搜索。

答案 7 :(得分:0)

hashmap中的元素可以是arraylist或另一个hashmap。这样一个键映射到多个整数。要搜索,您将查找第一个键,然后在结果中查找第二个键。查看BalusC's excellent example。根据您的评论,动态插入(如果它不知道密钥何时已添加)将类似于:

Map<String,Integer> x = m.get("vehicle");
if (x == null) {
  x = new HashMap<String,Integer>();
  m.put("vehicle", x);
}
x.put("mfg", 20000);

可以创建一个KeyPathMap类,在您请求时返回一个地图(getMap(“vehicle”)),并在请求包含一个的路径时返回一个值(get({“vehicle”,“mfg”,“ key 3“,”key 4“,”key 5“})),类似于filetree。

另一种方法是让你的密钥包含两个字符串。密钥可以是简单的串联(“车辆:制造商”)或下面的列表:

List<String> k = Arrays.asList("vehicle", "manufacturer");
map.put(k, 10000);
...
map.get(k);

你也可以使用一个自定义键对象,其中包含2个基于2的连接的哈希值(由overriding hashCode and equals完成;你的对象可以委托给internalString.hashCode和internalString.equals)。

[从评论中移出]

答案 8 :(得分:0)

可以在Google的Collection Framework中找到另一个多键实现。看看javadoc。它也是Apache V2许可的。

答案 9 :(得分:0)

您可以根据自己的要求使用Google的Guava the doc for API Management REST API Get a list of all APIs集合。

Map<Keys,Map<Name,Price>> ==> Table<Keys,Name,Price>
Map<Key1,Map<Key2,Value>> ==> Table<Key1,Key2,Value>