繁体   English   中英

知道键即可访问Map中的下3个元素值

[英]Accessing the next 3 element values in a Map knowing the key

我有java.util.LinkedHashMap,其中Integer作为键,Character作为值。 我知道我要访问的元素的密钥。 除了键的元素值之外,我还想检索接下来的3个元素值,以便可以附加所有4个元素值并形成具有4个字符的字符串。 我正在要求类似在java.util.List中的操作。 在地图/有序地图中,这是否可行? 请提出任何其他可以帮助我实现这一目标的数据结构。 我正在使用Java 6。

java.util.SortedMap具有subMap(fromKey,toKey)和tailMap(fromKey)方法。

如果知道所需的最后一个键,则可以使用第一个键,但是在这种情况下,由于需要固定数量的元素,应该尝试

SortedMap<Integer, Character> tail = l.tailMap(yourKey);
int cnt = 0;
List<Char> result = new ArrayList<Character>();
for (Iterator<Entry<Integer, Character>> it = tail.iterator(); it.hasNext() && cnt < 3; cnt++) {
  reasult.add(it.next());
}

请注意,如果地图的值不是不可变的,则列表中的更改将反映在地图中,反之亦然,因为我将元素的引用添加到了列表中(为避免这种情况,您应该在名单)。

映射有一种方法来获取表示键集和条目集的集合。 在这种情况下,您需要获取密钥集。 Map本身没有迭代器,但是此集合可以,并且您可以使用该迭代器获取下三个键的值。

话虽这么说,我不确定LinkedHashMap是Map实现的最佳选择。 根据LinkedHashMap的类型,元素将按输入顺序或最后引用顺序进行排序。

您可以使用TreeMap通过比较器按键对元素进行排序。

LinkedHashMap不提供此功能,不幸的是,使用私有内部类和package-private方法来实现该功能,因此您也不能在子类中执行任何操作。

来自Apache commons-collections的LinkedMap完全具有所需的功能(继承的entryAfter()方法)。 太糟糕了,它不是类型安全的...

我不这么认为,但是实现自己的LinkedHashSet可以花20分钟左右。

您需要两个类,一个用于保存键,值和nextNode指针的普通节点类,以及一个新的“ LinkedHashSet”类。

除了标准的获取器之外,您的节点类还应实现equals和hash来委托给key.equals和key.hash ...

您的LinkedHashSet应该包含一个HashSet,一个指向第一个节点的指针和一些辅助方法,以便用户永远不必看到HashSet或Node对象(它们都应该打包-不公开)。

就像使用任何其他链表一样,只需使用您的节点来构建链表,但同时将节点添加到哈希图中。 Node中的重写方法将确保可以在映射中查找值,但是要进行添加,您将必须像从任何链接列表开始一样,从Head节点开始遍历整个列表。

之后,只需实现添加,删除和其他所需的转发方法即可。 放大LinkedHashSet.getNext(item)就像查找项目的节点并获取它的nextNode一样简单,将项目从下一个节点中拉出并返回。

一件事有些棘手,对于任何类似get(item)的查找,您都必须实际实现以下内容(对不起,我缺少泛型):

public Object get(Item item) {
    node=new Node(item);
    hashSet.get(node);
    return node.itemValue();
}

请注意,即使是查找,您也必须将其包含在节点中-哈希会要求该元素才能正常运行。

只要我写一点代码,这就是getNext(item)的代码

public Object getNext(Item item) {
    node=new Node(item);
    hashSet.get(node);
    return node.getNextNode().itemValue();
}

无论如何,这是20分钟的努力,而且非常有教育意义-做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM