如何使用字符串" *"?在箭头上创建尾端?

时间:2016-10-03 22:40:23

标签: java string

这个问题可能看起来令人困惑,但其中的要点是我需要制作一个箭头,比方说,n = 3,这看起来像

*
**
***
**
*

我想在这个三角形上添加一条尾巴,使其成为一个箭头。它必须是长度(n-1)。所以:

  *
  **
*****
  **
  *

到目前为止我的代码,只能找到三角形。我似乎无法弄清楚如何让箭头上的尾巴。任何帮助都会很棒,谢谢!

public class Arrow
{
public static void main (String[] args)
{
 double n=0;
 if (args.length < 1){ 
    System.out.println("Input a number"); 
    System.exit(0); // Terminate the program if user has not input a number
  }
  else
    n = Double.parseDouble(args[0]); 

  String text = "*";
  int n1 = (int) n;
  System.out.println(text);
  for (int x = 1; x < n1; x++) {
     System.out.println(text += "*");
  }

  for (int i = (n1-1); i>0; i--) {
     System.out.println(text = text.substring(0, text.length()-1));
  }

} }

2 个答案:

答案 0 :(得分:0)

如果用可重用的辅助方法编写重复代码,那么代码就更容易编写。

这称为DRY原则(Don't Repeat Yourself)。

在这种情况下,您希望为箭头打印'*'的重复字符,并为缩进重复' '(空格)字符。因此,编写一种创建重复字符String的方法:

private static String repeat(char ch, int count) {
    char[] buf = new char[count];
    Arrays.fill(buf, ch);
    return new String(buf);
}

现在你已经拥有了,打印右箭头突然变得容易了:

private static void printRightArrow(char ch, int n) {
    for (int i = 1; i < n; i++)
        System.out.println(repeat(' ', n - 1) + repeat(ch, i));
    System.out.println(repeat(ch, n * 2 - 1));
    for (int i = n - 1; i >= 1; i--)
        System.out.println(repeat(' ', n - 1) + repeat(ch, i));
}

测试和输出

printRightArrow('*', 3);
printRightArrow('#', 7);
  *
  **
*****
  **
  *
      #
      ##
      ###
      ####
      #####
      ######
#############
      ######
      #####
      ####
      ###
      ##
      #

向另一个方向打印箭头非常相似:

private static void printLeftArrow(char ch, int n) {
    for (int i = 1; i < n; i++)
        System.out.println(repeat(' ', n - i) + repeat(ch, i));
    System.out.println(repeat(ch, n * 2 - 1));
    for (int i = n - 1; i >= 1; i--)
        System.out.println(repeat(' ', n - i) + repeat(ch, i));
}
private static void printUpArrow(char ch, int n) {
    for (int i = 1; i <= n; i++)
        System.out.println(repeat(' ', n - i) + repeat(ch, i * 2 - 1));
    for (int i = 1; i < n; i++)
        System.out.println(repeat(' ', n - 1) + ch);
}
private static void printDownArrow(char ch, int n) {
    for (int i = 1; i < n; i++)
        System.out.println(repeat(' ', n - 1) + ch);
    for (int i = n; i >= 1; i--)
        System.out.println(repeat(' ', n - i) + repeat(ch, i * 2 - 1));
}

测试和输出

printRightArrow('*', 5);
printLeftArrow('*', 5);
printUpArrow('*', 5);
printDownArrow('*', 5);
    *
    **
    ***
    ****
*********
    ****
    ***
    **
    *
    *
   **
  ***
 ****
*********
 ****
  ***
   **
    *
    *
   ***
  *****
 *******
*********
    *
    *
    *
    *
    *
    *
    *
    *
*********
 *******
  *****
   ***
    *

答案 1 :(得分:0)

这绝对不像Andreas&#39;解决方案,但它很像你的。我刚刚添加了一些for循环和if-else语句。

class Arrow {
    public static void main (String[] args) {
        double n = 0;
        if (args.length < 1){ 
            System.out.println("Input a number"); 
            System.exit(0); // Terminate the program if user has not input a number
        }
        else
            n = Double.parseDouble(args[0]); 

        String text = "";
        int n1 = (int) n;
        for (int x = 0; x < n1; x++) {
            for (int i = 0; i < n1 - 1; i++) {
                if (x != n1 - 1) {
                    System.out.print(" ");
                }
                else {
                    System.out.print("*");
                }
            }
            System.out.println(text += "*");
        }

        for (int i = (n1-1); i>0; i--) {
            for (int j = (n1 - 1); j > 0; j--) {
                System.out.print(" ");
            }
            System.out.println(text = text.substring(0, text.length()-1));
        }
    }
}