反向迭代LinkedHashMap

时间:2015-08-03 13:17:20

标签: java iteration linkedhashmap

我有一个LinkedHashMap(因为输入顺序很重要)。 我希望能够像数组一样迭代它的条目(键,值对) 从结束开始,因此foreach methods不适合此处 类似的东西:

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

4 个答案:

答案 0 :(得分:4)

没有有效的方法以相反的顺序迭代Set(例如entrySet)。如果你需要在两个方向上进行迭代,那么对于相反的方向,最好的方法是复制到临时列表并反向迭代列表。

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

答案 1 :(得分: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);
}

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

答案 2 :(得分: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());
    }
}

答案 3 :(得分:0)

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

所以,你需要的是......

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

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