代码之家  ›  专栏  ›  技术社区  ›  Matthew Stopa

Java:有一个数据结构,像MultMAP一样,但是接受重复的密钥吗?

  •  0
  • Matthew Stopa  · 技术社区  · 15 年前

    我有点难过。从本质上讲,我需要一个像数据库一样工作的数据结构。我需要能够为每个密钥提供多个数据位,并且有可能拥有多个同名的密钥。然后,我需要能够搜索该数据结构并提取正确的关键字,并对照其他可能的数据检查它。下面是一个例子:

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

    所以我需要特别能够搜索波音的飞机和飞机。由于很多原因,我不能使用一个实际的数据库,这将是完全多余的,因为我没有很多记录,但我需要能够提取这些值。我在Java中发现了MultIMAP实现,但它不允许我用相同的名称插入多个键,也不允许我搜索关键字,而是用相应的值进行搜索。

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

    编辑:好的,我查了所有的答案。出于某种原因,我无法理解任何情况,即您需要唯一的键,但您使用的是地图。有很多答案都是这个解决方案的特点,我对无法理解这些答案深表歉意。 最终我需要有多个唯一的键,我知道这些解决方案可以解决这个问题,但我就是搞不懂。

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

    10 回复  |  直到 9 年前
        1
  •  3
  •   Vinodh Ramasubramanian    15 年前

    为什么不使用ApacheCommons集合中的多密钥?

    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
  •  3
  •   alphazero    15 年前

    为什么不是 Set<Entry> 在哪里?

    public class Entry {
       String key;
       List<Item>  items;
    }
    public class Item {
        String name;
        int  price;
    }
    
        3
  •  2
  •   BalusC    15 年前

    你需要一个嵌套的 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");
    
        4
  •  1
  •   fastcodejava    15 年前

    你可以使用 Map 属于 地图 S.

        5
  •  0
  •   Suraj Chandran    15 年前

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

        6
  •  0
  •   sleske    15 年前

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

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

        7
  •  0
  •   Jherico    15 年前

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

        8
  •  0
  •   Community CDub    8 年前

    哈希图中的元素可以是arraylist或其他哈希图。这样,一个键映射到多个整数。要搜索,您需要查找第一个键,然后查找结果中的第二个键。退房 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);
    

    可以创建key path map类,该类在请求时返回映射(get map(“vehicle”),并在请求包含一个路径(get(“vehicle”、“mfg”、“key 3”、“key 4”、“key 5”))的路径时返回值,类似于文件树。

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

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

    您还可以使用一个自定义键对象,其中有两个字段根据2的串联进行散列(由 overriding hashCode and equals ;您的对象只能委托给InternalString.HashCode和InternalString.Equals)。

    [从评论中移动]

        9
  •  0
  •   dz.    15 年前

    另一个多键实现可以在谷歌的收集框架中找到。看看 javadoc .它还获得了Apachev2的许可。

        10
  •  0
  •   Jey Ganesh    9 年前

    你可以用谷歌的番石榴 Table 根据您的要求收集。

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