有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是一种获取键与条件匹配的所有映射值的有效方法

我在一个可索引的数据结构中有以下映射Map<IndexDerivedKey, Collection<Data<D>>> indexedData

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

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

IndexDerivedKey包含从上述键到其各自值的映射,并用于将对象存储在我前面提到的映射indexedData中。映射值是一种集合类型,因为多个对象可能相等(相对于索引)

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

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


一,

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

二,

  // 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) 个答案

  1. # 1 楼答案

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

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

    其中键是名字

  2. # 2 楼答案

    如果搜索始终按特定顺序进行,则创建一个具有可比较、和等于的键类

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