Java的:有一个数据结构,它就像一个多重映射,但接受重复键?(Java: Is there a d

2019-10-18 21:03发布

我有一点很难。 从本质上讲,我需要的数据结构,将工作有点像数据库。 我需要能够有多个比特的数据为每个键,并有具有相同名称的多个按键的可能性。 然后,我需要能够搜索这些数据结构和拉正确的密码并检查它免受其他数据。 下面是一个例子:

Keys   |   Name   |  Price

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

所以,我需要能够具体能够搜索飞机和飞机是波音公司。 对于很多的原因,我不能用一个实际的数据库,它会是完整的矫枉过正,因为我没有太多的记录,但我确实需要能够拉这些值。 我发现在Java中多重映射实现,但它并没有让我插入多个键具有相同的名称,也没有让我做搜索,不仅键,但键与相应的值。

任何人有这如何可能实现的想法? 谢谢

编辑:好吧,我看着所有的答案。 我由于某种原因,只是不明白,你需要钥匙是唯一的任何情况,但使用的是地图。 有迹象表明,拥有这种解决方案很多答案,我采取一切过错不能够理解他们。 最后,我需要有多个独特的钥匙,我知道这些解决方案是解决方法为,但我无法理解它。

虽然它远不是一个完美的解决方案,我用Apache的多键类,因为我只需要拉一个可能值它的作品没关系。 我感谢大家的努力,不幸的是我只是无法得到它,否则工作。 抱歉

Answer 1:

为什么不从阿帕奇百科全书集合使用多键

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


Answer 2:

为什么不Set<Entry>哪里

public class Entry {
   String key;
   List<Item>  items;
}
public class Item {
    String name;
    int  price;
}


Answer 3:

你需要一个嵌套的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");


Answer 4:

你可以使用MapMap秒。



Answer 5:

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



Answer 6:

你当然可以这样做使用Java的集合,但是这是真的,真的对数据库的任务。

你有没有使用嵌入式数据库考虑? 它们允许你一个DBMS的豪华设施,而无需实际需要一个(他们只是一个库)。 在SQLite的,或HSQLDB看如。



Answer 7:

为什么不使用像嵌入式数据库H2 。 然后,您可以在SQL中使用一些简单的包装一样了SimpleJdbcTemplate在春季执行搜索。 另外,您可以创建自己的对象执行ORM映射和使用HQL或通过例如在你映射的对象进行搜索。



Answer 8:

在HashMap中的元素可能是一个ArrayList或其他HashMap中。 这样一个键映射到多个整数。 搜索你会查找第一个键,然后在查找结果中的第二个键。 退房BalusC的很好的例子 。 根据您的评论,动态插入(如果它不知道什么时候已经加入键)会是这样的:

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操作(“车辆”)),并且当您请求包含一个(获得({“车辆”,“MFG”的路径返回一个值,“键3” , “键4”, “键5”})),类似于文件树。

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

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

你也可以使用自定义密钥对象与哈希基于2的级联2场(通过完成重写的hashCode和equals ;你的对象可以只委托给internalString.hashCode和internalString.equals)。

[从评论移动]



Answer 9:

另一种多键实现可以在谷歌的收集框架中找到。 看看的的javadoc 。 这就是Apache V2许可证,也。



Answer 10:

您可以使用谷歌的番石榴表收集您的要求。

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


文章来源: Java: Is there a data structure that works like a multimap but accepts duplicate keys?