Убрана запятая в конце при работе со StringBuilder

У меня есть следующая программа на Java, и я не хочу, чтобы "," назначался после моего последнего элемента, что делать?

String range = "400-450";
        Integer startRange = null;
        Integer endRange = null;
        StringTokenizer st = new StringTokenizer(range,"-");  
        while(st.hasMoreTokens()) { 
            startRange = Integer.parseInt(st.nextToken()); 
            endRange= Integer.parseInt(st.nextToken()); 
        } 
        StringBuilder sb = new StringBuilder();
        for (int i = startRange; i <= endRange; i++) {
            sb.append(i).append(",");
        }
        System.out.println(sb);

Вывод должен быть 400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450 --> наконец без запятой


person Community    schedule 12.01.2016    source источник


Ответы (6)


Просто как

for (int i = startRange; i <= endRange; i++) {
   sb.append(i);
   if(i != endRange)
        sb.append(",");
}
person Gianni B.    schedule 12.01.2016

Для Java 8 вы можете переключиться на новый класс StringJoiner, который был добавлен именно для этой цели:

    StringJoiner sb = new StringJoiner(",");
    for (int i = startRange; i <= endRange; i++) {
        sb.add(String.valueOf(i));
    }
    System.out.println(sb.toString());

Делая это вручную, я предлагаю добавить запятую перед элементом, а затем использовать substring(1):

    for (int i = startRange; i <= endRange; i++) {
        sb.append(",").append(i);
    }
    //Check for empty before!
    System.out.println(sb.substring(1));
person Jan    schedule 12.01.2016
comment
Это не компилируется, так как StringJoiner.add() принимает CharSequence не целое число. Вам нужно sb.add(String.valueOf(i)); - person Neil Masson; 12.01.2016

Как говорит @Jan, используйте StringJoiner, если у вас есть Java8. В противном случае вы можете добавить разделитель перед новой записью и по-другому обработать первый элемент, установив разделитель пустым.

   String separator = "";
    for (int i = startRange; i <= endRange; i++) {
        sb.append(separator).append(i);
        separator = ",";
    }

Это версия Java8

    StringJoiner sb = new StringJoiner(",");
    for (int i = startRange; i <= endRange; i++) {
        sb.add(String.valueOf(i));
    }
person Neil Masson    schedule 12.01.2016

Используйте Joiner (гуава) для Java ‹ 8.

List<Integer> numbers = Lists.newArrayList(1, 3, 4, 5, 23);
System.out.println(Joiner.on(",").join(numbers));

И вывод:

1,3,4,5,23

person g-t    schedule 12.01.2016

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

String range = "400-450";
        Integer startRange = null;
        Integer endRange = null;
        StringTokenizer st = new StringTokenizer(range,"-");  
        while(st.hasMoreTokens()) { 
            startRange = Integer.parseInt(st.nextToken()); 
            endRange= Integer.parseInt(st.nextToken()); 
        } 
        StringBuilder sb = new StringBuilder();
        // here, the "<=" was changed to "<"
        for (int i = startRange; i < endRange; i++) {
            sb.append(i).append(",");
        }
        // append last element
        sb.append(endrange)
        System.out.println(sb);
person jkalden    schedule 12.01.2016
comment
Все еще запятая (,) идет наконец, я не хочу этого - person ; 12.01.2016
comment
Спасибо за подсказку! Смотрите предпоследнюю строку для исправления! - person jkalden; 12.01.2016

Вы добавляете "," после каждой i попытки добавить ",", только если вы не достигли endRange

do:

for (int i = startRange; i <= endRange; i++) {
            sb.append(i)
            if (i != endRange)
              sb.append(",");
        }

таким образом "," не будет добавлено к sb после последнего числа.

person Geis    schedule 12.01.2016
comment
Пожалуйста, не просто публикуйте код — добавьте объяснение, почему это решает проблему. - person Neil Masson; 12.01.2016