有效获取键与条件匹配的所有地图值的方法

时间:2015-06-25 13:55:23

标签: java dictionary

我在可索引数据结构中有以下地图Map<IndexDerivedKey, Collection<Data<D>>> indexedData

IndexDerivedKey符合Index,索引由键和相应的值组成。这些键用于从可索引数据结构中的元素中提取值。

例如,有一个索引,它由键firstNamelastName组成,我们使用此索引从具有这些属性的对象中提取值,此操作产生IndexDerivedKey每个对象。

IndexDerivedKey包含从上面的键到它们各自值的映射,用于将对象存储在我之前提到的地图indexedData中。 map值是一个集合类型,因为几个对象可能相等(相对于索引)。

问题 如何使用firstName = "John"提取所有对象,同时忽略lastName的值。显然,我可以迭代所有键并检查firstNameO(n)的值。

但由于IndexDerivedKey {firstName = "John"}firstName = "John"所有其他键的子集,例如{firstName = "John", lastName = "Smith"},我想必须有一种更有效的方式。也许使用TreeSet

1

  public IndexDerivedKeyImpl(Index index, Map<String, String> keyValues)
  {
    this.keyValues = keyValues;
    this.index = index;

    for (String key : keyValues.keySet())
      if (!index.supportsKey(key))
        throw new IndexKeyMismatchException(key, index);
  }

2

  // in data.Index.index(Indexable)
  @Override
  public IndexDerivedKey index(Indexable data)
  {
    Map<String, String> keyValues = new HashMap<String, String>();
    IndexDerivedKey key = new IndexDerivedKeyImpl(this, keyValues);

    for (String k : keys)
    {
      String value = data.get(k);
      if (value != null)
        keyValues.put(k, value);
    }

    return key;
  }

2 个答案:

答案 0 :(得分:1)

如果您想使用其他密钥访问Map,最好使用其他Map

Map<String, Collection<Data<D>>> dataByFirstName = // ...

其中键是名字。

答案 1 :(得分:1)

如果搜索始终在特定订单上,请使用Comparable创建一个密钥类,并且等于。

然后使用SortedMap,例如TreeMap。这也是可导航。例如,您可以使用subMap(fromKey, toKey)