2014-01-13 25 views
0

我不知道該怎麼做一些具體的事情在for循環的最後一個循環:我如何獲得這個循環工作正確?

String msg = "---Player List, Count:" + users.size() + "---" + brln; 
for (int i = 0; i < users.size(); i++) { 
    if((i - 1) == users.size()){ 
      msg += "--::" + users.get(i).name; //Do this at the last loop 
      return; //returns the void 
    } 
    msg += "--::" + users.get(i).name + brln; // do this by default 
} 

你能幫我得到這個工作?

+4

如何循環users.size() - 1次,然後做最後一點? – gtgaxiola

+0

我不能這樣做,因爲它使用forloop中的int – FFlaser

+0

@FFlaser好吧..你知道盡管會有什麼價值。 –

回答

1

你做錯了。更改行:

if((i - 1) == users.size()) 

通過這一個:

if(i == (users.size()-1)) 
2

如果你需要最後一個索引只使用if(i == users.size()-1)

在你提供你應該使用一個StringBuilder字符串連接的例子。然後,您只需循環而不詢問任何內容,並且可以使用for-each循環。

StringBuilder msg =new StringBuilder().append("---Player List, Count:").append(users.size()).append("---"); 
for (User user : users) { 
    msg.append(brln) 
    .append("--::").append(user.name) 
    .append(brln); 
} 
4

你的條件是錯誤的:不是(i - 1) == users.size()使用(i + 1) == users.size()i == users.size() - 1

基本上(i - 1) == users.size()會匹配最後一個(顯然不存在)後的元素,即對於您將獲得的大小爲5的列表(i - 1) == 5i == 6

在上面(i + 1) == users.size()i == users.size() - 1的例子將解析(i + 1) == 5i == 5 - 1這兩個結果i == 4,這是在列表中的最後一個索引。

編輯:順便說一句,你的循環仍然很奇怪。你基本上似乎在每個元素之後添加一個換行符,但最後一個元素。你爲什麼不把它改成這樣的:

String msg = "---Player List, Count:" + users.size() + "---" + brln; 
for (int i = 0; i < users.size(); i++) { 
    if(i > 0){ 
    msg += brln; 
    } 
    msg += "--::" + users.get(i).name; 
} 

這會在除第一行之外的每一行之前添加一個換行符。注意情況如何更容易。

1

更改條件

i == users.size() - 1  

爲什麼?在Java(和其他語言)中,列表中的第一個元素位於索引0處,並且是N-1處的最後一個元素(如果N是當前位於列表中的元素的數量),所以users.size() - 1是最後一個元素的索引。例如,如果在用戶列表中的10個元素,最後將在指數9

全碼:

String msg = "---Player List, Count:" + users.size() + "---" + brln; 

for (int i = 0; i < users.size(); i++) { 

    //if i equals to the last index, do your special handling of the loop 
    if(i == (users.size() - 1)) { 
     msg += "--::" + users.get(i).name; //Do this at the last loop 
     break; 
    } 

    msg += "--::" + users.get(i).name + brln; // do this by default 
} 
+0

謝謝你提醒我。 – Melquiades

2

更改此 來自:

if((i - 1) == users.size()){ 

到:

if((i + 1) == users.size()){ 
2

要在發揮作用,通過一個分隔符,在分隔符是換行分隔的條目的字符串。使用這個成語:

String delimiter = "", result = ""; 
for (...loop init...) { 
    result += delimiter; 
    ...append one entry... 
    delimiter = brln; 
} 

除此之外,通過在每個迭代創建新的字符串建設一個大型的字符串是不好的性能,因爲它是一個爲O​​(n^2)操作。您應該更喜歡StringBuilder

+0

對於StringBuilder建議+1。 – nachokk

0

雖然這樣不能幫你,現在(當你不使用Java 8),這一切混亂的代碼將具備Java 8結束:

// requires Java 8 
String msg = users.stream().map(User::name).collect(Collectors.joining(brln)); 
+0

我想我會發現更具可讀性。但就目前而言,我看着這一點,不寒而慄。 –

+0

是的,也許有人需要先習慣它。但是讓我感到不寒而慄的是,這樣一個小問題讓大約10個人討論它!因此,我認爲每個更簡單,更不容易出錯的解決方案都是受歡迎的。 ;) – isnot2bad

2

如果你改變你的代碼一點點,你能避免的特殊情況:

StringBuilder msg = new StringBuilder("---Player List, Count:" + users.size() 
    + "---"); // Note a lack of brln 

for (int i = 0; i < users.size(); i++) {  
    msg.append(brln + "--::" + users.get(i).name); 
} 

return msg.toString(); 

理想情況下,你應該使用StringBuilder在循環連接字符串,如我之前所做的那樣。

此方法適用於你的情況,因爲你有包括換行頭。請參閱其他解決方案插入每一次出現,但上一次的串X在一個循環一個通用的方法)。

+0

+1這是一個很好的答案:) – nachokk

+0

也是我的+1。我撤回了上面的評論(在問題下)。 –