【问题标题】:Print a rhombus pattern from user input从用户输入打印菱形图案
【发布时间】:2018-02-25 11:21:37
【问题描述】:

我的任务是要求用户输入(用户名),然后从中打印出菱形图案。 例如: 如果用户的名字是 Thomas,那么输出应该是这样的:

T
Th
Tho
Thom
Thoma
Thomas
 homas
  omas
   mas
    as
     s

到目前为止,这是我的代码。我在使用第二个 for 循环时遇到问题。我可以轻松打印出“Thomas”之前的行,但我不知道如何在前面打印空格,以便单词的结尾在同一个地方。

import java.util.Scanner;

public class wordRhombus {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    System.out.print("Enter your name: ");
    String name = sc.nextLine();
    int enteredNamesLength = name.length();

    for (int i = 0; i <= enteredNamesLength; i++) {
      System.out.println(name.substring(0, (int) i));

      for (int j = 1, k = 1; j <= enteredNamesLength; i++, k++) {
        System.out.println(k * " " + name.substring(j, enteredNamesLength));
      }
    }
  }
}

【问题讨论】:

    标签: java shapes ascii-art


    【解决方案1】:

    我认为必须有一个 for 循环来像您所做的那样打印名称,然后是另一个 for 空间,并在同一个内部打印子字符串。

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter your name: ");
        String name = sc.nextLine();
        int enteredNamesLength = name.length();
    
        for (int i = 0; i <= enteredNamesLength; i++) {
                System.out.println(name.substring(0, (int) i));
        }
    
        for(int i = 1;i <= enteredNamesLength; i++ ) {
                for(int j = 0;j < i; j++) {
                        System.out.print(" ");
                }
                System.out.println(name.substring(i, enteredNamesLength));
        }
    }
    

    【讨论】:

      【解决方案2】:

      2 次会更容易:substring 从开始到索引,然后打印世界末日后跟的空格,以及要做的一些更改:

      • 无需将i 转换为int,它已经是int
      • 第一个循环:从 1 而不是 0 开始索引 i,没有避免空行
      • 第二个循环i 的结束索引位于 enteredNamesLength-1 而不是 enteredNamesLength 以避免空行

      for (int i = 1; i <= enteredNamesLength; i++) {    // start at 1
          System.out.println(name.substring(0, i));      // don't cast
      }
      
      for (int i = 1; i < enteredNamesLength; i++) {     // stop at enteredNamesLength-1
          for (int space = 0; space <= i; space++) {
              System.out.print(" ");
          }
          System.out.println(name.substring(i, enteredNamesLength));
      }
      

      【讨论】:

        【解决方案3】:

        这是另一种解决方案,您可以提取一个接受startstopprint 方法。如果它们之间有index,则在index处打印字符,否则打印空格。

        import java.util.Scanner;
        
        public class wordRhombus {
        
            public static void main(String[] args) {
                Scanner sc = new Scanner(System.in);
                System.out.print("Enter your name: ");
                String name = sc.nextLine();
                int enteredNamesLength = name.length();
        
                for (int start = 0, stop = 0; start < enteredNamesLength && stop < enteredNamesLength; ) {
                    print(start, stop, name);
                    if (stop < enteredNamesLength - 1) {
                        stop++;
                    } else {
                        start++;
                    }
                }
            }
        
            private static void print(int start, int stop, String name) {
                for (int index = 0; index < name.length(); index++) {
                    if (index >= start && index <= stop) {
                        System.out.print(name.charAt(index));
                    } else {
                        System.out.print(" ");
                    }
                }
                System.out.println();
            }
        }
        

        【讨论】:

          【解决方案4】:

          您可以将上面的增加部分和下面的减少部分组合在一个循环中。

          Try it online!

          public static void main(String[] args) {
              String str = "RHOMBUS";
              int n = str.length();
              // two parts: negative and positive
              for (int i = 1 - n; i < n; i++) {
                  // leading whitespaces for the positive part
                  for (int j = 0; j < i; j++) System.out.print(" ");
                  // negative part: str.substring(0, n + i);
                  // positive part: str.substring(i, n);
                  String sub = str.substring(Math.max(0, i), Math.min(n + i, n));
                  // output the line
                  System.out.println(sub);
              }
          }
          

          输出:

          R
          RH
          RHO
          RHOM
          RHOMB
          RHOMBU
          RHOMBUS
           HOMBUS
            OMBUS
             MBUS
              BUS
               US
                S
          

          另见:Writing a word in a rhombus / diamond shape

          【讨论】:

            【解决方案5】:

            此代码适用于常规 UTF8 字符和代理对

            Try it online!

            public static void main(String[] args) {
                String str = "???????";//"RHOMBUS";
                int n = (int) str.codePoints().count();
                // two parts: negative and positive, i.e.
                // upper increasing and lower decreasing
                IntStream.range(1 - n, n)
                        // leading whitespaces for the positive part
                        .peek(i -> IntStream.range(0, i)
                                .forEach(j -> System.out.print(" ")))
                        // negative part: range(0, n + i);
                        // positive part: range(i, n);
                        .mapToObj(i -> str.codePoints()
                                .skip(Math.max(0, i))
                                .limit(Math.min(n + i, n))
                                .mapToObj(Character::toString)
                                .collect(Collectors.joining()))
                        // output the line
                        .forEach(System.out::println);
            }
            

            输出:

            ?
            ??
            ???
            ????
            ?????
            ??????
            ???????
             ??????
              ?????
               ????
                ???
                 ??
                  ?
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-11-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-03-30
              • 1970-01-01
              相关资源
              最近更新 更多