Java: улучшение для печати числовых пирамид, с выравниванием и инверсией - PullRequest
3 голосов
/ 20 ноября 2011

Примечание 1: у меня уже есть грубый, многословный, зацикленный грязный код.
Примечание 2: Ищем более элегантные способы установить это - «меньшее» количество строк и умную логику. Примечание 3: не домашнее задание, я хобби, пытаюсь улучшить.

Функция для кодирования:

printNumericPyramid(int depth, String alignment, String orientation);

глубина: + целое число до 4
выравнивание: один из «левый» / «правый»
ориентация: одна из "вертикально" / "перевернутая"

0 всегда будет на вершине, в вертикальном или в обратном направлении.
0259/9520 всегда будет высотой пирамиды.


Выборка вызовов и ожидаемых результатов:

printNumericPyramid(4, "left", "inverted");

9876
543.
21..
0...

printNumericPyramid(4, "right", "upright");

...0
..12
.345
6789

printNumericPyramid(4, "right", "inverted");

6789
.345
..12
...0


printNumericPyramid(4, "left", "upright");

0...
21..
543.
9876

Было бы замечательно, если бы "меньшее" количество строк могло быть в центре внимания предлагаемого решения. Не путем удаления всех разрывов строк :), а путем минимизации кода (даже если это ухудшает читабельность).

1 Ответ

1 голос
/ 20 ноября 2011

(Во-первых, обратите внимание, что определение вашего метода подвержено ошибкам: если аргумент может принимать только два значения, вы можете использовать логическое значение вместо строки. Если вы неправильно введете «left», «right» или «inverted» или "в вертикальном положении", ваш метод будет работать, но даст неправильный результат)

Если вы хотите сосредоточиться на небольшом количестве строк, вам не следует повторяться, и вы можете использовать троичный оператор и доступные API Java.

Вы могли бы написать очень короткое решение, основанное на очень "умном" и полностью нечитаемом коде внутри цикла следующего вида:

   public void printNumericPyramid( final int depth, final String alignment, final String orientation ) {
        for (int i = 0; i < depth; i++) {
            for (int j = 0; j < depth; j++) {
                System.out.print ( ... ) // insert some smart hackery in here computing if we should print 0-9 or '.'
            }
            System.out.println();
        }
    }

Однако это может оказаться не так легко читаемым, и будет легко ошибиться в логике.

Итак, я написал другое решение:

  • на каждом символе вы печатаете следующее значение (от 0 до 9) или вы печатаете точку '.'.

  • когда линия «сделана», я добавляю эту строку или эту линию в обратном порядке, в зависимости от значения параметра alignment .

  • если запрашивается обратное представление, вы можете просто сторнировать сбор

    public void printNumericPyramid( final int depth, final String alignment, final String orientation ) {
        final List<String> l1 = new ArrayList<String>();
        for (int i = 0, c = 0; i < depth; i++) {
            final StringBuilder sb = new StringBuilder();
            for (int j = 0; j < depth; j++) {
                sb.append( j >= depth - (i + 1) ? c++ : "." );
            }
            l1.add("left".equals(alignment) ? sb.reverse().toString() : sb.toString());
        }
        if ( "inverted".equals(orientation) ) Collections.reverse(l1);
    
        for ( final String s : l1 ) {
            System.out.println( s );
        }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...