在Java中如何反向迭代LinkedHashMap?

3

我有一个LinkedHashMap(因为条目的顺序很重要)。 我想能够像数组一样从末尾到开头迭代它的条目(键值对),所以foreach 方法不适用于这里。 类似于:

for (int i = DestIndexStartPair.entrySet().size() , i> 0 ; i--) {
    entry = DestIndexStartPair.entrySet()[i];
    String Endsection = output.substring(entry.value());
    System.out.println(Endsection );
}
4个回答

4

遍历Set(例如entrySet)没有有效的方法可以逆序进行。如果需要在两个方向上进行遍历,则对于相反方向,最好的方法是复制到临时列表中,并在逆序遍历列表。

当然,如果您只需要一个方向,则应该确保LinkedHashMap具有顺序而不是相反顺序。


保持正确的排序似乎是最实际的解决方案... - Brian Agnew

2

可行的解决方案:

List<Entry<Foo,Bar>> list = new ArrayList<Entry<Foo,Bar>>(map.entries());

for (int i = list.size() - 1; i >= 0; i--) {
    Entry<Foo,Bar> entry = list.get(i);
}

显然,这里的取舍是你必须将整个地图复制到数组列表中。如果你的地图太大(无论多大),你可能会遇到性能和内存问题。

1
他不是说这个不起作用吗? - Brian Agnew
抱歉,我看错了。已经更正了。 - darijan
这个很棒! - LordTitiKaka

2

看一下地图实现可能会更有帮助。也许通过更合适的方式覆盖,可以在性能或线程安全等方面实现平衡。但是这里有一个小技巧,可能会有所帮助:

public class HackedLinkedHashMap<K,V> extends LinkedHashMap<K,V> implements Map<K,V> {

private LinkedList<K> keyList = new LinkedList<>();

@Override
public V put(K key, V value){
    V obj = super.put(key, value);
    keyList.addFirst(key);

    return obj;
}

public LinkedList<K> getReversedKeyList(){
    return keyList;
}}


public static void main(String[] args) {
    System.out.println("Test conference");
    HackedLinkedHashMap<Integer, Integer> map = new HackedLinkedHashMap();
    for(Integer i=0;i<100;i++){
        map.put(i, i);
    }   
    Iterator<Integer> iterator = map.getReversedKeyList().iterator();
    while (iterator.hasNext()){
        System.out.println(iterator.next());
    }
}

这可能是最好的方法,我也会尝试。 - LordTitiKaka

0

EntrySet是一个Set,因此通常没有索引。

所以,你需要的是...

for(Entry<K,V> entry : DestIndexStartPair.entrySet()) {
    String Endsection = output.substring(entry.value()); // whatever output is
    System.out.println(Endsection );
}

...然后存储结果并将其反转。


嗨,我需要从结尾到开头而不是从开头到结尾。 - LordTitiKaka
除了迭代并将其存储在列表中,然后再次反向执行,我看不到其他选择。 - Florian Schaetz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接