2013-02-06 69 views
2

收件接受整數List和整數作爲參數的Set方法counts,並且從每個值集合中的返回地圖以在該值的出現次數名單。對於每個循環的工作原理,但迭代器不

我的解決方案#1:

public static Map<Integer, Integer> counts(List<Integer> list, Set<Integer> set) { 
    Map<Integer, Integer> map = new TreeMap<Integer, Integer>(); 
    Iterator<Integer> i = list.iterator(); 

    for(Integer element : set) { 
     int count = 0; 
     for(Integer sub : list) { 
      if(sub == element) { 
       count++; 
      } 
     } 
     map.put(element, count); 
    } 

    return map; 
} 

我的解決方案#2:

public static Map<Integer, Integer> counts(List<Integer> list, Set<Integer> set) { 
    Map<Integer, Integer> map = new TreeMap<Integer, Integer>(); 
    Iterator<Integer> i = list.iterator(); 

    for(Integer element : set) { 
     int count = 0; 
     while(i.hasNext()) { 
      if(i.next() == element) { 
       count++; 
      } 
     } 
     map.put(element, count); 
    } 

    return map; 
} 

輸入:

list: [4, -2, 3, 9, 4, 17, 5, 29, 14, 87, 4, -2, 100] 
set: [-2, 4, 29] 

預期輸出:

{-2=2, 4=3, 29=1} 

輸出爲#1:

{-2=2, 4=3, 29=1} 

輸出爲#2:

{-2=0, 4=3, 29=0} 

的第一個工程,但第二個沒有。爲什麼?他們基本上是一樣的東西,還是我錯過了什麼?另外,將使用for循環工作來遍歷列表?如果不是,爲什麼?

+0

什麼不同的方法做還是不做,你有什麼期望的輸出? – Serdalis

+0

您確定要參考比較嗎? – nhahtdh

+0

在一種情況下,您的迭代器在外部循環內被隱式聲明,在另一種情況下,它在外部顯式聲明... – assylias

回答

5

你忘了每個循環後,迭代器復位,請嘗試以下操作:

for(Integer element : set) { 
    int count = 0; 
    i = list.iterator(); // resets the iterator to the first element. 
    while(i.hasNext()) { 
     if(i.next() == element) { 
      count++; 
     } 
    } // by the end of this loop the iterator has no next elements, need to reset. 
    map.put(element, count); 
} 
+0

+1確認此項更改已生效。 – Eric