2016-03-04 98 views
-9

假設我有一個包含m元素的Map,如下所示。有沒有辦法在Java中無限循環地圖元素?

Map<String,Integer> mp = new HashMap<String,Integer>(); 

mp.put("Delhi",1); 
mp.put("Bombay",1); 
mp.put("Bangalore",1); 

這裏,m = 3。我想以循環次序訪問上述元素的地圖,具體次數爲n,其中n!= m。每次訪問Map時,我都想獲取Map中的「下一個」元素(以便暗示Map條目按某種方式排序)。如果我想到Map的結尾,我想在開始時重新開始,因爲我想在所有情況下都準確地訪問地圖n次。 nm之間沒有關係。每次我訪問地圖元素欲由1

例如,以增加元件的值給出了上述Map與3個元素(m == 3),並假定我要訪問的Map五次總( n == 5)。下面應該發生:

步驟 - >字符串(鍵) - >整數(值)

1 - >德里 - > 2

2 - > Bombay-- > 2

3 - >班加羅爾 - > 2

4 - >德里 - > 3

5 - >孟買 - > 3

對此的任何建議將不勝感激,甚至改變DataStructure。

我特別關注通過外部循環串聯地圖元素。

我不想要什麼:假設我有一個循環說

for(1 to numberofcycles) 
{ 
    for(iterate-->mapelements) 
    { 
     //looping mapelements 
    } 
} 

我會通過地圖0​​* numberofmap元素,而這並不是我期待着能夠實現循環。

取而代之,我想要循環訪問mapelements,按照循環順序準確地按numberofcycles循環,並在每次訪問後更改/添加1值。

保持通過圖中循環順序進行迭代,直到達到特定的條件。

+2

只要做到這一點?既然你想遍歷所有元素,那麼順序不應該是一個問題(如果你不改變地圖,那麼隨後調用'values()'應該返回相同的順序)。如果順序很重要,那麼請改用'LinkedHashMap'。 – Thomas

+3

您可以通過編寫程序來實現這一點。如果你遇到任何問題,你可以在SO上寫一個問題。 – blafasel

+1

使用Google搜索您的問題可能是一個好的開始。 – Perdomoff

回答

1

據我瞭解,你想一共有n人次,每一個到不同的目的地,你在一個預定義的順序訪問的目的地。怎麼樣這樣的事情...

如果你想如果你想在地圖來治理秩序

要訪問的城市中爲了指定獨立的地圖

Map<String,Integer> mp = new HashMap<>(); 

mp.put("Delhi",1); 
mp.put("Bombay",1); 
mp.put("Bangalore",1); 

int numberOfTrips = 5; 
List<String> orderOfVisits = Arrays.asList("Delhi", "Bombay", "Bangalore"); 
Iterator<String> visiterator = orderOfVisits.iterator(); 

for (int i = 0; i < numberOfTrips; i++) { 
    // Get a new iterator if we've exhausted the previous one 
    if (!visiterator.hasNext()) { 
    visiterator = orderOfVisits.iterator(); 
    } 

    // Get the correct city and increment the counter 
    String key = visiterator.next(); 
    mp.put(key, mp.get(key) + 1); 
} 

// demonstrate that the map contains the correct values 
for (Entry<String, Integer> entry: mp.entrySet()) { 
    System.out.println("Key:" + entry.getKey() + ", Value:" + entry.getValue()); 
} 

的順序它們被加入到Map,你可以做到以下幾點:

1)從HashMap變化mp的聲明LinkedHashMap

Map<String,Integer> mp = new LinkedHashMap<>(); 

2)遍歷Map的鍵集:

visiterator = mp.keySet().iterator(); 

如果你想用一個比較

1)的mp聲明更改爲TreeMap指定的順序,提供一個比較:

Map<String,Integer> map = new TreeMap<>(Comparator.naturalOrder()); 

2)迭代的密鑰集就像上面的例子。

所有代碼

public static void tripsInConfigurableOrder() { 
    Map<String, Integer> mp = new HashMap<String, Integer>(); 

    mp.put("Delhi", 1); 
    mp.put("Bombay", 1); 
    mp.put("Bangalore", 1); 

    int numberOfTrips = 5; 
    List<String> orderOfVisits = Arrays.asList("Delhi", "Bombay", "Bangalore"); 
    Iterator<String> visiterator = orderOfVisits.iterator(); 

    for (int i = 0; i < numberOfTrips; i++) { 
     if (!visiterator.hasNext()) { 
      visiterator = orderOfVisits.iterator(); 
     } 

     String key = visiterator.next(); 
     mp.put(key, mp.get(key) + 1); 
    } 

    for (Entry<String, Integer> entry : mp.entrySet()) { 
     System.out.println("Key:" + entry.getKey() + ", Value:" + entry.getValue()); 
    } 
} 

public static void tripsInNaturalOrder() { 
    Map<String, Integer> mp = new LinkedHashMap<>(); 

    mp.put("Delhi", 1); 
    mp.put("Bombay", 1); 
    mp.put("Bangalore", 1); 

    int numberOfTrips = 5; 
    Iterator<String> visiterator = mp.keySet().iterator(); 

    for (int i = 0; i < numberOfTrips; i++) { 
     if (!visiterator.hasNext()) { 
      visiterator = mp.keySet().iterator(); 
     } 

     String key = visiterator.next(); 
     mp.put(key, mp.get(key) + 1); 
    } 

    for (Entry<String, Integer> entry : mp.entrySet()) { 
     System.out.println("Key:" + entry.getKey() + ", Value:" + entry.getValue()); 
    } 
} 

public static void usingComparator() { 
    Map<String, Integer> mp = new TreeMap<>(Comparator.naturalOrder()); 

    mp.put("Delhi", 1); 
    mp.put("Bombay", 1); 
    mp.put("Bangalore", 1); 

    int numberOfTrips = 5; 
    Iterator<String> visiterator = mp.keySet().iterator(); 

    for (int i = 0; i < numberOfTrips; i++) { 
     if (!visiterator.hasNext()) { 
      visiterator = mp.keySet().iterator(); 
     } 

     String key = visiterator.next(); 
     mp.put(key, mp.get(key) + 1); 
    } 

    for (Entry<String, Integer> entry : mp.entrySet()) { 
     System.out.println("Key:" + entry.getKey() + ", Value:" + entry.getValue()); 
    } 
} 

public static void main(String[] args) { 
    tripsInConfigurableOrder(); 
    tripsInNaturalOrder(); 
    usingComparator(); 
} 
+0

感謝您展示的方式有沒有一種方法,我們可以實現這一點,而不必使用列表? – snoopy

+0

添加了幾個替代品 –

+0

定製的數據結構,以我的要求,使用雙向鏈接列表感謝您在這個論壇的幫助.. – snoopy

0

如何使用while循環並將迭代放入while循環中?

Map<String, Integer> map = ... 
while (true or some condition) 
{ 
    for (Map.Entry<String, Integer> entry : map.entrySet()) 
    { 
     map.put(key, map.get(key) + 1); 
    } 

    if (some condition met) 
     some condition = false 
} 

編輯

我看了你的後期編輯,這裏是你想做的事的解決方案。 當您到達maxCycle時,您可以使用break退出for循環。

Map<String, Integer> map = ... 
int numberOfCycles = 0; 
int maxCycle = 10; 
while (numberOfCycles < maxCycle) 
{ 
    for (Map.Entry<String, Integer> entry : map.entrySet()) 
    { 
     if (++numberOfCycles < maxCycle) 
      map.put(key, map.get(key) + 1); 
     else 
      break; 
    } 
} 

說你從0開始,個MaxCycle是5.如果重複5次,它會去別的,並呼籲break。在break之後,您將回到while循環並且滿足退出條件。

+0

謝謝解決方案不是我要找的 – snoopy

+0

請看看添加的部分。我認爲這會解決你的問題。 – BrokenBacon

1
Map<String,Integer> mp = new HashMap<String,Integer>(); 

mp.put("Delhi",1); 
mp.put("Bombay",1); 
mp.put("Bangalore",1); 

for (int i = 0 ; i < numberOfCycles; i++){ 
    for (String key : mp.keySet()){ 
     mp.put(key,mp.get(key)+1); 
    } 
} 
+0

絕對不是我在尋找的感謝請在跳閘之前再次閱讀這個問題 – snoopy

+1

@snoopy您已經在幾個不同的答案上說過這個問題。您是否想解釋*爲什麼*這不能回答您的問題? – tnw

相關問題