2015-08-27 61 views
-1

我在Java中使用HashMap以格式(名稱,大小)保存三對服務器,然後將此HashMap傳遞給Javascript。Java HashMap:在打印最後一個條目後不寫逗號

在Javascript中存在的最後一個條目後面沒有逗號:

data: [ 
{ 
    name : "client3", 
    y:23, 
}, 
{ 
    name : "client1", 
    y:245, 
}, 
{ 
    name : "client2", 
    y:23, 
}] 

,所以我不知道如何在Java中擺脫這個逗號的使用HashMap的迭代器:

for (Map.Entry<String, String> entry : listClientSize.entrySet()) { 
    String name = entry.getKey().toString();; 
    String size = entry.getValue(); 
    out.println("name : \""+name+"\","); 
    out.println("y:"+size+","); 
    out.println("},"); 
} 

任何想法?

+0

的(http://stackoverflow.com/questions/285523/last-iteration-of- [在Java循環的最後一次迭代]可能重複for-loop-in-java) –

+0

看看'StringJoiner' – user

+0

@johnny 5爲什麼unvote?我們在這裏討論hashmap – brest1007

回答

2

而是在端,環寫逗號,它在寫開始。這是很多比上次迭代更容易檢查第一次迭代。

boolean first = true; 
for (Map.Entry<String, String> entry : listClientSize.entrySet()) { 
    String name = entry.getKey().toString();; 
    String size = entry.getValue(); 
    if (first) 
     first = false; 
    else 
     out.println("},"); 
    out.println("{"); 
    out.println("name : \""+name+"\","); 
    out.println("y:"+size); 
} 
out.println("}"); 

BTW:你失蹤啓動支柱{的打印,並且有y值後加上逗號。

更新:由於處理第一重複這一模式是如此普遍,且動作是如此簡單(通常只是附加一個分離器),我通常會崩潰的代碼如下所示(如果你不這樣做有嚴格的編碼標準):

if (first) first = false; else out.println("},"); 
+0

...這與我3分鐘前的回答相同,但帶有代碼。太好了! :-) +1 – Thomas

+0

@Thomas你只能打敗我,因爲編寫代碼需要時間。 :-P – Andreas

+0

我知道;-)我刪除了我的答案,你的答案更容易理解。 – Thomas

1

爲了擺脫y屬性後面的逗號,這是在對象中的最後一個屬性的,只是這樣做:

for (Map.Entry<String, String> entry : listClientSize.entrySet()) { 
     String name = entry.getKey().toString();; 
     String size = entry.getValue(); 
     out.println("name : \""+name+"\","); 
     out.println("y:"+size); 
     out.println("},"); 
    } 

若要在最後的擺脫,而不是印刷的逗號, for循環,建立一個字符串,然後使用substring在for循環後切斷最後一個字符,然後打印字符串

+1

這是正確的,但我認爲OP也關注'}'後面的逗號。 – Thomas

+0

編輯包括 –

+0

使用子字符串的建議將不必要地複製文本。在流式傳輸輸出時最好做到這一點。 ---無論如何,向不完整的代碼示例投票。 – Andreas

1

您可以嘗試的一件容易事是累積要在StringBuilder中打印的字符串,然後剝離最後一個逗號,使用子字符串。它應該是這樣的:

StringBuilder output = new StringBuilder(); 
for (Map.Entry<String, String> entry : listClientSize.entrySet()) { 
     String name = entry.getKey(); 
     String size = entry.getValue(); 
     output.append("{name :\"").append(name).append("\", "); 
     output.append("y: ").append(size).append("},");  
} 
String toPrint = output.substring(1, output.size() - 1); 
out.println(toPrint); 
+0

使用'StringBuilder'的好處,但是你可以通過在'output.append(「{name:\」「)。append(name).append(」,「)中鏈接'append'來改善代碼。 - **注意:**您錯過了名稱值的結束引用 – Andreas

+0

不錯,謝謝提示。我不是方法鏈的最大粉絲,但在這種情況下,它可能是合理的。 –

+0

爲什麼你是否在循環之外聲明和初始化'name'和'size'?在循環內部更好,以保持它們在本地的作用域 – Andreas

0

您可能需要一種方法來判斷它是否不是最後一個條目,然後附加逗號。一種簡單的方法是每次迭代保持一個計數器增量。如果計數!=散列表大小追加逗號

2

看來您正在創建JSON,因此請考慮使用適當的JSON解析器來生成結果。例如與GSON庫中的代碼可能看起來像含

類單一的信息要存儲

public class Server{ 
    private String name; 
    private int value; 
    public Server(String name, int value) { 
     this.name = name; 
     this.value = value; 
    } 
    //getters and setters 
} 

你可以使用這個類,如:

List<Server> list = new ArrayList<>(); 
list.add(new Server("1", 245)); 
list.add(new Server("2", 23)); 
list.add(new Server("3", 23)); 

Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
String json = gson.toJson(list); 
System.out.println(json); 

這將產生:

[ 
    { 
    "name": "1", 
    "value": 245 
    }, 
    { 
    "name": "2", 
    "value": 23 
    }, 
    { 
    "name": "3", 
    "value": 23 
    } 
] 

如果您是絕對的,您可以在開始時稍後添加data =你需要它。

+0

+1用於提示有效的替代方案,儘管根據上下文/限制,*可能*不是OP的適當解決方案。 – Andreas

+1

@Andreas如果OP正在做家庭作業,那麼他可能不被允許使用外部庫。但我會離開這個解決方案作爲替代,所以其他人也可以學習如何輕鬆地解決這個任務:) – Pshemo

+0

@Thanks但我沒有生成JSON,這是打印餅圖使用highchart.js – brest1007

2

如果你可以使用Java 8中,使用StringJoiner

final StringJoiner stringJoiner = new StringJoiner(","); 

    Map<String,String> listClientSize = new HashMap<String,String>(){{ 
     put("client3","23"); 
     put("client1","245"); 
     put("client2","23"); 
    }}; 
    for (Map.Entry<String, String> entry : listClientSize.entrySet()) { 
     String name = entry.getKey().toString();; 
     String size = entry.getValue(); 
     stringJoiner.add(String.format("{name:\"%s\", y:%s}", name, size)); 
    } 
    System.out.println(stringJoiner.toString()); 
+0

您還可以像'new StringJoiner(「,」,「data:[」,「]」);''添加前綴'data:['和suffix']''。 – Pshemo