2015-07-02 151 views
2

我想使方法removeValue("a", "x")
它必須刪除字母之間的所有鍵和值。例如, {1 = a,2 = b,3 = c,5 = x} - >> {1 = a,5 = x}。我嘗試過使用equals和iterator,但我不知道如何編寫它。Java HashMap迭代器

public class CleanMapVal { 

    public static void main(String[] args) throws Exception { 


     Map<String, String> map = new HashMap<String, String>(); 
     map.put("1", "a"); 
     map.put("2", "b"); 
     map.put("3", "c"); 
     map.put("4", "w"); 
     map.put("5", "x"); 

     System.out.println(map); 

     for (Iterator<String> it = map.keySet().iterator(); it.hasNext();) 
      if ("2".equals(it.next())) 
       it.remove(); 

     System.out.println(map); 

    } 

    public static <K, V> void removeValue(Map<K, V> map) throws Exception { 
     Map<K, V> tmp = new HashMap<K, V>(); 
     for (Iterator<K> it = map.keySet().iterator(); it.hasNext();) { 
      K key = it.next(); 
      V val = map.get(key); 
      if (!tmp.containsValue(val)) { 
       tmp.put(key, val); 
      } 
     } 
     map.clear(); 
     for (Iterator<K> it = tmp.keySet().iterator(); it.hasNext();) { 
      K key = it.next(); 
      map.put((K) tmp.get(key), (V) key); 
     } 
    } 
} 
+3

您有一個問題,因爲'Map'不能保證其條目的排序;所以沒有像「a和x之間的鍵」這樣的東西開始。當然,你也可以使用'LinkedHashMap',但是我的懷疑是這是一個XY開始的問題。 – fge

+0

我不確定你在做什麼。正如@fge提到的HashMap沒有保證的順序。另外LinkedHashMap命令它的元素像List,新的元素放在最後,所以你仍然沒有通過它們的值(或者鍵)保證元素的順序。因此,讓我們說你有地圖'{a = 1,b = 2,c = 3,d = 2,e = 1}',並調用'removeValue(「1」,「3」)''。應該是'{a = 1,c = 3,d = 2,e = 1}還是'{a = 1,c = 3,e = 1}'或者別的什麼? – Pshemo

回答

0

使用的Iterator讓您免去在飛行條目。

public void removeRange(Map<Integer, String> map, String from, String to) { 
    // Walk each entry. 
    for (Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator(); it.hasNext();) { 
     // What is the value? 
     String v = it.next().getValue(); 
     if (v.compareTo(from) > 0 && v.compareTo(to) < 0) { 
      // In the specified range! Remove it. 
      it.remove(); 
     } 
    } 

} 

public void test() { 
    Map<Integer, String> map = new HashMap<>(); 
    map.put(1, "a"); 
    map.put(2, "b"); 
    map.put(3, "c"); 
    map.put(4, "w"); 
    map.put(5, "x"); 
    System.out.println("Before:" + map); 
    removeRange(map, "a", "x"); 
    System.out.println("After:" + map); 
} 

打印

之前:{1 = A,2 = B,3 = C,4 = W 5 = X}

後:{1 = A,5 = X}

如果您使用的是Java 8還可以流和過濾地圖。

​​
+0

'v.compareTo(from)> 0 && v.compareTo(to)<0'如果在map中我們有'map.put(1,「a」) ; map.put(2,「x」); map.put(3,「w」); map.put(4,「c」);''表示鍵的順序被改變 –

+0

@AnkitNigam - 我不讀取涉及鍵的問題 - 我把它讀作*刪除所有含有**值**的項但不包括)「a」和「x」*。 – OldCurmudgeon

2

使用樹形圖以維持秩序,然後迭代以除去元素嘗試使用以下code.I'm。

所有的
Map<Integer, String> map = new TreeMap<Integer, String>(); 
    map.put(1, "a"); 
    map.put(2, "b"); 
    map.put(3, "c"); 
    map.put(4, "w"); 
    map.put(5, "x"); 
    ArrayList<Integer> intList = new ArrayList<Integer>(); 
    for (Iterator<Integer> it = map.keySet().iterator(); it.hasNext();) { 
     int key = 0; 
     if (it.next() == 1) { 
      while(true) { 
       key = it.next(); 
       if(key==5)break; 
       intList.add(key); 

      } 
     } 

    } 
    //removing from the map in separate loop to avoid concurrent modification exception 

    for (int i : intList) { 
     map.remove(i); 
    } 

    System.out.println(map.size()); //2 
1

首先,HashMap永遠保持它被放在它的Object的訂單。所以你需要使用LinkedHashMap,它維持其插入順序。 對於去除Object你需要使用的Iterator

Map testMap = new LinkedHashMap<Integer, String>();如果您key是任何其他類型的除了Integer改變它相應。

因此,對於你的要求,你可以使用下面的代碼: -

public static void testKey(Map<Integer, String> testMap, String startValue, 
      String endValue) { 
if(!testMap.containsValue(startValue) || !testMap.containsValue(endValue)) 
      return; // if start/end value is not present in Map then no change at all 
     Iterator<Map.Entry<Integer, String>> iter = testMap.entrySet() 
       .iterator(); 
     boolean deleteFlag = false; 
     while (iter.hasNext()) { 
      Map.Entry<Integer, String> entry = iter.next(); 
      if (endValue.equalsIgnoreCase(entry.getValue())) { 
       deleteFlag = false; 
      } 
      if (deleteFlag) 
       iter.remove(); 
      if (startValue.equalsIgnoreCase(entry.getValue())) { 
       deleteFlag = true; 
      } 

     } 
    } 

public static void main(String[] args) { 
     Map m = new LinkedHashMap<Integer, String>(); 
     m.put(1, "a"); 
     m.put(2, "b"); 
     m.put(3, "c"); 
     m.put(5, "x"); 
     System.out.println("before : "+m); 
     removeValue(m, "a", "x"); 
     System.out.println("after : "+m); 
    } 

輸出

before : {1=a, 2=b, 3=c, 5=x} 
after : {1=a, 5=x} 
+0

太棒了!謝謝!! – Sergey

+0

很高興它幫助。如果它對你有用,你可以將其標記爲正確 –