Удалить конечную запятую Java без строковой переменной?

public static void printGrid(int rows, int cols) {
    int totalNum = rows * cols;
    for (int i = 1; i <= rows; i++) {
        for (int k = 0; k < cols; k++) {
            System.out.print(i + rows * k + ", ");
        } System.out.println();      
    }
}

Outputs = 1, 4, 7, 10, 13, 16, 
          2, 5, 8, 11, 14, 17, 
          3, 6, 9, 12, 15, 18, 

Я хочу удалить конечные запятые по последним числам в каждой строке, но у меня нет переменной в виде строки, содержащей их, просто оператор печати. Есть какой-либо способ сделать это?


person Lompang    schedule 09.01.2015    source источник
comment
Вместо того, чтобы пытаться удалить его, как насчет того, чтобы просто не добавлять его?   -  person Jeroen Vannevel    schedule 10.01.2015


Ответы (3)


Просто печатайте его только при необходимости:

public static void printGrid(int rows, int cols) {
    int totalNum = rows * cols;
    for (int i = 1; i <= rows; i++) {
        for (int k = 0; k < cols; k++) {
            System.out.print(i + rows * k);
            if (k < cols - 1) System.out.print(", ");
        }
        System.out.println();      
    }
}

Вывод для аргументов 3, 6 будет:

1, 4, 7, 10, 13, 16
2, 5, 8, 11, 14, 17
3, 6, 9, 12, 15, 18
person MightyPork    schedule 09.01.2015
comment
Это не будет печатать запятую в конце 1-й и 2-й строки - person ; 10.01.2015
comment
Опустошитель, прекрати распространять ложь. Я даже попробовал это в Eclipse, чтобы доказать, что вы ошибаетесь. Мое решение работает правильно. - person MightyPork; 10.01.2015
comment
@MightyPork Я думаю, Desolator неправильно понял вопрос и подумал, что OP хочет, чтобы была удалена только самая последняя запятая (в вашем примере та, что в 18). - person Tom; 10.01.2015
comment
Да, наверное, ты прав. После изменения этого println на print это действительно то, что он будет делать. - person MightyPork; 10.01.2015

Хотя вы можете протестировать после печати в пост-условии, как это было предложено @MightyPork в этом ответ

System.out.print(i + rows * k);
if (k < cols - 1) {
    System.out.print(", ");
}

Я бы проверил, что k не является 0, и напечатал запятую, когда она не находится в предварительном условии, например

if (k != 0) {
    System.out.print(", ");
}
System.out.print(i + rows * k);
person Elliott Frisch    schedule 09.01.2015
comment
Это действительно сработает, но чем лучше? Не придираюсь к этому, действительно любопытно. - person MightyPork; 10.01.2015
comment
@MightyPork Не нужно вычислять cols - 1 на каждой итерации. Но я думаю, это не будет иметь большого значения. Кстати: что вы, ребята, думаете о if (k > 0)? Лучше? - person Tom; 10.01.2015
comment
Это не лучше, так как они в основном делают то же самое. Но я предпочитаю предварительное условие для удобочитаемости, просто мнение. Он говорит, что я не хочу, чтобы первый символ был ,, вместо того, чтобы я не хотел, чтобы последний символ был ,. - person Elliott Frisch; 10.01.2015
comment
да, я так и думал, может быть, микрооптимизация ... если бы это было во встроенном, это было бы большой разницей, поскольку там тестирование на ноль намного проще. - person MightyPork; 10.01.2015

Эффективность не имеет значения, если ваш код труден для понимания. Часть проблемы связана с тем, как вы пытаетесь объединить композицию строк с выводом. Вы должны полностью разделить эти вещи:

static void printGrid(int rows, int cols) {
    System.out.println(getGrid(rows, cols));
}

static String getGrid(int rows, int cols) {
    StringBuilder b = new StringBuilder();
    int totalNum = rows * cols;

    for (int i = 1; i <= rows; i++) {
        for (int k = 0; k < cols; k++) {
            b.append(i + rows * k).append(", ");
        }
        b.delete(b.size()-2,b.size());
        b.append('\n');  
    }
    return b.toString();
}

В качестве альтернативы вы можете использовать Guava Joiner или в Java 8 вы можете использовать Collectors.joining

person AJMansfield    schedule 09.01.2015