Java小例子:打印一个金字塔

这是最基础的例子了,每个初学者都会要做这个题目。这个题目的目的是熟悉循环特 别是嵌套循环的使用。但是如果对 Java 足够熟悉,回头来再写这个程序,就完全不是这 么写的了。

嵌套循环是非常复杂的逻辑。特别是写得很长的嵌套循环,一个不小心把 j 写成 i, 就够你调试半天的。所以嵌套循环应该尽量避免。怎么避免?将内部循环提取成一个方法 。这样每个方法里都只有一层循环,容易看,容易改,而且不容易出错。

import java.util.Arrays;

/**

 * 打印一个字符组成的金字塔

 */

public class Pyramid {

    // 程序入口

    public static void main(String[] args) {

        printPyramid(21, '*');

    }

    /**

     * 打印一座金字塔。

     *

     * @param bottom_width 底层宽度。必须是奇数。

     * @param ch           组成金字塔的字符

     */

    private static void printPyramid(int bottom_width, char ch)  {

        if (bottom_width < 1 || bottom_width % 2 == 0)  {

            throw new IllegalArgumentException();

        }

        int height = bottom_width / 2 + 1;  // 金字塔的高度

        for (int i = 0; i < height; i++) {

            int width = i * 2 + 1;    // 本层的宽度

            System.out.println(getLevel(bottom_width, width,  ch));

        }

    }

    /**

     * 生成金字塔的一行

     *

     * @param bottom_width 金字塔宽度

     * @param width        本层的宽度

     * @param ch           要打印的字符

     *

     * @return 金字塔的一行

     */

    private static String getLevel(int bottom_width, int width,  char ch) {

        int space_width = (bottom_width - width) / 2;   //  前面空格的宽度

        return expand(' ', space_width) + expand(ch, width);

    }

    /**

     * 生成包含若干个字符的字符串。

     *

     * @param c     生成字符串的字符

     * @param width 字符串的长度

     *

     * @return 生成的字符串

     */

    private static String expand(char c, int width) {

        char[] chars = new char[width];

        Arrays.fill(chars, c);

        return new String(chars);

    }

}

看完你可能觉得奇怪:这里有嵌套吗? 有。Arrays.fill() 方法最终就是通过循环实 现的。

时间: 2016-04-05

Java小例子:打印一个金字塔的相关文章

Java小例子

想当年学 BASIC 的时候,获取用户输入多简单,就一个 input:后来学 C, 也挺简单,一个 scanf():后来学 c++,同样简单,一个 cin <<:到了 Java 这里,麻烦来了. 1.简单的获取用户输入 下面是一个基本的例子,包含解释: 1.import java.io.BufferedReader; 2.import java.io.InputStreamReader; 3.import java.io.IOException; 4. 5.public class Basic

Java小例子:创建一个可拖拽图片的面板

今天在论坛上看到帖子希望能在 Swing 中实现像拖地图一样拖拽图片.这里是一个最 简单的实现,提供了一个基本思路. import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.M

Java小例子:图书馆课程设计

用 Java 模拟一个图书馆.包括创建图书.创建读者.借书.还书.列出所有图书. 列出所有读者.列出已借出的图书.列出过期未还的图书等功能.每个读者最多只能借 3 本书,每个书最多只能借 3 个星期,超过就算过期. 下面是一个命令行下的实现.这个例子的主要目的是向初学者展示内部类的好处. Command 及其子类都是 LibrarySimulator 的内部类.它们可以无阻碍的访问 LibrarySimulator 的成员.使用内部类,而不是大量的 if-else,让程序更容易扩展. 01.im

Java小例子:按指定的编码读取文本文件内容

InputStreamReader 的构造函数提供了一个参数,用于指定通过什么编码将 读取到的字节流转换成字符.下面是一个例子: 01./** 02. * 读取指定的文本文件,并返回内容 03. * 04. * @param path 文件路径 05. * @param charset 文件编码 06. * 07. * @return 文件内容 08. * 09. * @throws IOException 如果文件不存在.打开失败或读取失败 10. */ 11.private static S

Java小例子:根据Map对象的内容创建JavaBean

Java 提供 java.beans.Introspector 类,帮助我们分析 JavaBean 类当中 有哪些属性,通过它可以方便的对 JavaBean 对象属性进行取值和赋值操作.下 面是一个例子,根据 Map 对象中的内容创建 JavaBean 对象. 01.import java.beans.BeanInfo; 02.import java.beans.IntrospectionException; 03.import java.beans.Introspector; 04.impor

Java小例子:通过Socket发送和接收文件

这是一个简单的包含发送端和接收端的例子.发送端向接收端发送文件名和文件内容 ,接收端将收到的文件保存在磁盘上.接收端可以同时接收多个发送端传来的文件,但没 有处理文件同名的情况. 这个例子中设计了一个简单的协议.发送的内容是这样的: 文件名长度(4字节)-文件名-文件内容长度(4字节)-文件内容 . 接收端也按照这个结构进行解析.建议先看 Client 类,再看 Server 类. 01.import java.io.*; 02.import java.net.ServerSocket; 03.

Java小例子:输出格式化数字

我们经常要将数字进行格式化,比如取2位小数,这是最常见的.Java 提供 DecimalFormat 类,帮你用最快的速度将数字格式化为你需要的样子.下面是 一个例子: import java.text.DecimalFormat; public class TestNumberFormat { public static void main(String[] args) { double pi = 3.1415927; // 圆周率 // 取一位整数 System.out.println(ne

java服务器如何打印一个URL内容?

问题描述 传一个URL,服务器端java如何调用javax.print的api将其内容打印出来?内容是一个jsp,根据参数从数据库读取数据生成的报表,有图片.注意是服务器端打印,非客户端调用ie的js打印.另外最好别生成pdf后再打印 解决方案

Java小例子:分解质因数

这个例子演示如何利用递归来完成分解质因数. import java.util.List; import java.util.ArrayList; /** * 分解质因数 */ public class GetFactor { public static void main(String[] args) { List<Long> factors = getFactors(5555566666L, 2); System.out.println(factors); } /** * 通过递归实现分解质