我有一个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 );
}
答案 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 );
}
...然后存储结果,并将其反转。