2015-08-27 2 views
-1

Я использую hashmap в Java, чтобы содержать три пары серверов в формате (имя, размер), а затем передать эту хэш-карту в 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

возможный дубликат [последней итерации для цикла в Java] (http://stackoverflow.com/questions/285523/last-iteration-of- for-loop-in-java) –

+0

Посмотрите на 'StringJoiner' – user

+0

@johnny 5 Зачем не показывать? Мы говорим 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("}"); 

КСТАТИ: Вы отсутствовали на печать старт-скобой { и имел запятую после значения y.

Update: Так что шаблон для обработки первой итерации настолько распространена, что и действие так просто (как правило, просто добавив разделитель), я обычно разрушаться код следующим образом (не делайте этого, если вам имеют строгие стандарты кодирования):

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

... что совпадает с моим ответом 3 минуты назад, но с кодом. Ницца! :-) +1 – Thomas

+0

@Thomas Вы только избили меня до ответа, потому что потребовалось время, чтобы написать код. :-P – Andreas

+0

Я знаю ;-) Я удалил свой ответ, ваш легче понять. – Thomas

1

Чтобы избавиться от запятой после собственности у, что последнее свойство в объекте, просто сделать это:

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

Kudos для использования 'StringBuilder', но вы можете улучшить код, привязав' append', как в 'output.append (" {name: \ ""). Append (name) .append (",") '. - - ** Примечание: ** Вам не хватает конечной кавычки для значения имени. – Andreas

+0

Правда, спасибо за советы. Я не самый большой поклонник цепочки методов, но в этом случае это может быть оправдано. –

+0

вы объявляете и инициализируете «имя» и «размер» вне цикла? Лучше внутри цикла, чтобы поддерживать их локально. – Andreas

0

Возможно, вам понадобится способ узнать, добавляет ли его не последняя запись, а затем добавляет запятую. Одним из упрощенных способов является поддержание счетчика n n приращения каждой итерации. Если counter! = Hashmap size append comma

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 = в начале, если вы absolutel Мне это нужно.

+0

+1 для предложения действительной альтернативы, хотя это * может * не быть подходящим решением для ОП, в зависимости от контекста/ограничений. – Andreas

+1

@Andreas Правда, если ОП выполняет домашнее задание, тогда ему не разрешается использовать внешние библиотеки. Но я оставлю это решение альтернативным, чтобы другие могли также узнать, как легко решить эту задачу :) – Pshemo

+0

@ Спасибо, но я не создаю 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

Вы также можете добавить префикс 'data: [' и suffix ']' like 'new StringJoiner (", "," data: [","] ");'. – Pshemo

Смежные вопросы