Java:改进打印数字金字塔,具有对齐和反转

时间:2011-11-20 17:21:02

标签: java loops

注1:我已经有了蛮力,冗长,循环的凌乱代码 注2:寻找更优雅的方法来建立这个 - "较小的"行数和聪明的逻辑。 注3:不做作业,我是一个想要改进的业余爱好者。

要编码的功能:

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

深度:+ ve整数最多4个 alignment:" left" /" right"
方向:"直立" /"倒立"

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 个答案:

答案 0 :(得分:1)

(首先请注意,您的方法定义容易出错:如果参数只能使用两个值,则可以使用布尔值而不是字符串。如果您错误地“左”或“右”或“倒”或者“直立”,你的方法会起作用但产生错误的结果)

如果你想专注于少量的行,那么你不应该重复自己,你可以使用三元运算符和可用的Java API。

   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 );
        }
    }