【问题标题】:Iterate over LinkedHashMap in reverse [duplicate]反向迭代LinkedHashMap [重复]
【发布时间】:2015-08-03 13:17:20
【问题描述】:

我有一个LinkedHashMap(因为输入顺序很重要)。 我希望能够像数组一样迭代它的条目(键、值对) 从 end to start 所以 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 );
}

【问题讨论】:

    标签: java iteration linkedhashmap


    【解决方案1】:

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

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

    【讨论】:

    • 正确维护排序似乎是最实用的解决方案...
    【解决方案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);
    }
    

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

    【讨论】:

    • 他不是说这有效吗?
    • 抱歉,没看对。已更正。
    • 这个很好用!
    【解决方案3】:

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

    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());
        }
    }
    

    【讨论】:

    • 这可能是最好的方法了,我也试试
    【解决方案4】:

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

    那么,你需要的是……

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

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

    【讨论】:

    • 嗨,我需要结束而不是开始结束
    • 除了迭代它并将其存储在一个列表中然后再次向后执行之外,没有太多选择。
    猜你喜欢
    • 1970-01-01
    • 2012-12-28
    • 2014-09-15
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多