Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:是否有一种数据结构可以像多重映射一样工作,但接受重复的键?_Java_Oop_Data Structures_Map - Fatal编程技术网

Java:是否有一种数据结构可以像多重映射一样工作,但接受重复的键?

Java:是否有一种数据结构可以像多重映射一样工作,但接受重复的键?,java,oop,data-structures,map,Java,Oop,Data Structures,Map,我的日子有点不好过。从本质上说,我需要一个工作起来有点像数据库的数据结构。我需要能够为每个键拥有多个数据位,并且有可能拥有多个同名键。然后,我需要能够搜索该数据结构,提取正确的关键字,并对照其他可能的数据进行检查。以下是一个例子: Keys | Name | Price Airplane | Boeing | 10000 Airplane | LearJet | 4000 Airplane | Airbus | 20000 Car | Honda | 500 Car | Ford

我的日子有点不好过。从本质上说,我需要一个工作起来有点像数据库的数据结构。我需要能够为每个键拥有多个数据位,并且有可能拥有多个同名键。然后,我需要能够搜索该数据结构,提取正确的关键字,并对照其他可能的数据进行检查。以下是一个例子:

Keys   |   Name   |  Price

Airplane | Boeing | 10000
Airplane | LearJet | 4000
Airplane | Airbus | 20000
Car | Honda | 500
Car | Ford | 450
Car | Chevy | 600
所以我需要能够特别地搜索飞机和波音的飞机。由于很多原因,我无法使用实际的数据库,这完全是过火了,因为我没有很多记录,但我确实需要能够提取这些值。我在Java中找到了一个multimap实现,但它不允许我插入多个同名键,也不允许我不仅搜索键,还搜索具有相应值的键

有人知道如何实现这一点吗? 谢谢

编辑:好的,我看了所有的答案。出于某种原因,我无法理解任何情况下,你需要的钥匙是唯一的,但你使用的是地图。这个解决方案有很多答案,我完全不理解它们。 最终我需要有多个唯一的密钥,我知道这些解决方案是解决这个问题的方法,但我就是搞不懂


虽然它远不是一个完美的解决方案,但我使用了Apache的多键类,因为我只需要提取一个可能的值,所以它可以正常工作。我感谢每个人的努力,不幸的是,我无法让它工作,否则。抱歉

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

public class Entry {
   String key;
   List<Item>  items;
}
public class Item {
    String name;
    int  price;
}
公共类条目{
字符串键;
清单项目;
}
公共类项目{
字符串名;
国际价格;
}

您可以使用
Map
s的
Map

您需要一个嵌套的
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");
Map vehicles=newhashmap();
Map airplanes=new HashMap();
车辆。放置(“飞机”,飞机);
飞机。put(“波音”,10000);
飞机。put(“LearJet”,4000);
飞机。put(“空中客车”,20000);
Map cars=newhashmap();
车辆。放置(“车辆”,车辆);
汽车。投入(“本田”,500);
汽车。普特(“福特”,450);
汽车。投入(“雪佛兰”,600);
//要获得飞机-空中客车的价格,只需执行以下操作:
整数价格=车辆。获取(“飞机”)。获取(“空中客车”);

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

//使用数据映射键+名称到价格填充映射
Map Map=newhashmap();
多键多键=新的多键(键,名称);
map.put(多键,价格);
//后来,我放弃了这个价格
多键多键=新的多键(键,名称);
price=(字符串)map.get(价格);

您当然可以使用Java的集合来完成这项工作,但这确实是数据库的一项任务


您是否考虑过使用嵌入式数据库?它们允许您享受DBMS的所有奢华,而实际上不需要DBMS(它们只是一个库)。例如,看看SQLite或HSQLDb。

为什么不直接使用嵌入式DB,如。然后,您可以使用一些简单的包装器(如Spring中的SimpleJDBCTemplate)在SQL中执行搜索。或者,您可以为对象创建ORM映射,并在映射对象上使用HQL或“示例搜索”

hashmap中的元素可以是arraylist或其他hashmap。这样,一个键映射到多个整数。要进行搜索,请先查找第一个键,然后在结果中查找第二个键。退房根据您的评论,动态插入(如果它不知道密钥是何时添加的)类似于:

Map<String,Integer> x = m.get("vehicle");
if (x == null) {
  x = new HashMap<String,Integer>();
  m.put("vehicle", x);
}
x.put("mfg", 20000);
Map x=m.get(“车辆”);
如果(x==null){
x=新的HashMap();
m、 放置(“车辆”,x);
}
x、 put(“制造商”,20000);
可以创建一个KeyPathMap类,该类在您请求地图时返回地图(getMap(“vehicle”)),并在您请求包含地图的路径时返回值(get({“vehicle”、“mfg”、“key 3”、“key 4”、“key 5”)),类似于文件树

另一种方法是使键同时包含两个字符串。钥匙可以是简单的连接(“车辆:制造商”)或以下列表:

List<String> k = Arrays.asList("vehicle", "manufacturer");
map.put(k, 10000);
...
map.get(k);
List k=Arrays.asList(“车辆”、“制造商”);
图.put(k,10000);
...
map.get(k);
您还可以使用带有2个字段的自定义键对象,这些字段根据2的串联进行散列(由完成;您的对象可以委托给internalString.hashCode和internalString.equals)


[从评论中删除]

在谷歌的收藏框架中可以找到另一个多键实现。请看下面的图片。它也是Apache V2许可的。

您可以根据需要使用谷歌的番石榴系列

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

我很难想象那会是怎样的。就像我如何搜索两个项目那样,我将如何搜索项目?使用列表,您需要迭代项目。如果大小相当小(并且是O(n)),那么这应该是可以的。否则,项可以是HashMap(项名称作为键),并且您有O(1);如果沿着这条路走下去,你可以简单地删除物品并将名称存储为键,价格作为价值。是的,看起来最终我必须写一些东西来循环多个键。我必须考虑这个解决方案,因为我的所有键都将动态添加,我需要多个同名键。我不能再激烈地反对了。就像我说的,我将在这个表中有很少的项目。为了这件小事而建立数据库?我觉得这太疯狂了。就像用核武器杀死一只鸟。如果你在你的应用程序中做了很多这样的事情,是的,我可以看到,但要处理所有这些事情,这真的需要很多。嗯,我喜欢这个解决方案。我不知道它将如何允许访问多个值。我看到了问题。我倾向于从PredictedSortedMap bu的角度思考
Map<Keys,Map<Name,Price>> ==> Table<Keys,Name,Price>
Map<Key1,Map<Key2,Value>> ==> Table<Key1,Key2,Value>