【问题标题】:Move Item in LinkedHashMap在 LinkedHashMap 中移动项目
【发布时间】:2015-02-27 00:22:26
【问题描述】:

有没有办法在LinkedHashMap 中移动项目?具体来说,我想将一个项目移动到第一个位置。我知道如果我想在末尾添加一个项目,我可以这样做:

LinkedHashMap<String,Integer> items = new LinkedHashMap<String,Integer>();
//...add some items
int i = items.get("removedItem");
items.remove("removedItem");
items.put("removedItem",i);

【问题讨论】:

  • 没有。即使LinkedHahsMap 在迭代时尊重插入顺序,它仍然实现Map,其中没有“将项目放在首位”这样的方法。在集合中,只有List 可以可靠地做到这一点。

标签: java collections hashmap linkedhashmap


【解决方案1】:

对于将项目移动到前面的情况,您可以使用您的首选顺序创建一个新的 LinkedHashMap。例如

LinkedHashMap<K,V>  newMap = new LinkedHashMap<K,V>(oldMap.size());
V valueIWantToBeFirst= oldMap.remove(keyIWantToBeFirst);
newMap.put(keyIWantToBeFirst, valueIWantToBeFirst);
newMap.putAll(oldMap);  // keeps previous order for all remaining entries

【讨论】:

    【解决方案2】:

    如果你想保持相同的Map 实例,你可以像这样在 3 行中完成。

    Map<Integer, String> map = new LinkedHashMap<>();
    map.put(1, "One");
    map.put(2, "Two");
    map.put(3, "Three");
    map.put(4, "Four");
    
    Map<Integer, String> copy = new LinkedHashMap<>(map);
    map.keySet().retainAll(Collections.singleton(3));
    map.putAll(copy);
    
    System.out.println(map);
    

    【讨论】:

    • 实际上,我的LinkedHashMap&lt;String,ArrayList&lt;Integer&gt;&gt;。是否会将copy 中包含的3ArrayList 附加到map 中的ArrayList 上?
    • ArrayList 中的键 mapArrayList 中的 copy 中的键相同,因此应该没有任何区别。
    • 你说的是key还是value?
    • 我的意思是价值,对不起。
    【解决方案3】:

    public void sortList() {

        ArrayList<String> objectsToOrder=new ArrayList<>(object.keySet());
    
        ArrayList<String> orderedObjects=new ArrayList<>();
        orderedObjects.add("A");
        orderedObjects.add("B");
        orderedObjects.add("C");
        orderedObjects.add("D");
        orderedObjects.add("E");
    
        LinkedHashMap<String,ArrayList<QueryRow>>  orderedlist = new LinkedHashMap<String,ArrayList<QueryRow>>(object.size());
    
      for(int i=0;i<orderedObjects.size();i++){
          if(objectsToOrder.contains(orderedObjects.get(i))){
              ArrayList<QueryRow> valueIWantToBeFirst= object.remove(orderedObjects.get(i));
              orderedlist.put(orderedObjects.get(i),valueIWantToBeFirst);
          }
      }
    
        orderedlist.putAll(new LinkedHashMap<String, ArrayList<QueryRow>>(object));
    
        object.clear();
    
        object.putAll(new LinkedHashMap<String, ArrayList<QueryRow>>(orderedlist));
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多