我在可索引数据结构中有以下地图Map<IndexDerivedKey, Collection<Data<D>>> indexedData
。
IndexDerivedKey
符合Index
,索引由键和相应的值组成。这些键用于从可索引数据结构中的元素中提取值。
例如,有一个索引,它由键firstName
和lastName
组成,我们使用此索引从具有这些属性的对象中提取值,此操作产生IndexDerivedKey
每个对象。
IndexDerivedKey
包含从上面的键到它们各自值的映射,用于将对象存储在我之前提到的地图indexedData
中。 map值是一个集合类型,因为几个对象可能相等(相对于索引)。
问题
如何使用firstName = "John"
提取所有对象,同时忽略lastName
的值。显然,我可以迭代所有键并检查firstName
中O(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;
}
答案 0 :(得分:1)
如果您想使用其他密钥访问Map
,最好使用其他Map
:
Map<String, Collection<Data<D>>> dataByFirstName = // ...
其中键是名字。
答案 1 :(得分:1)
如果搜索始终在特定订单上,请使用Comparable创建一个密钥类,并且等于。
然后使用SortedMap
,例如TreeMap
。这也是可导航。例如,您可以使用subMap(fromKey, toKey)