用户的输入形成单词菱形

时间:2018-02-25 11:21:37

标签: java

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

T  
Th  
Tho  
Thom  
Thoma  
Thomas  
 homas  
  omas  
   mas  
    as  
     s   

到目前为止,这是我的代码。我遇到了第二个循环问题。我可以很容易地打印出直到“托马斯”的行,但我不知道,如何打印前面的空白,以便该单词的结尾位于同一个地方。

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

感谢您的时间和帮助!

5 个答案:

答案 0 :(得分:1)

我认为必须有一个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));
    }
}

答案 1 :(得分:1)

在2次中更容易做到:substring从开始到索引,然后打印空格,然后是世界末尾,并做一些更改:

  • 无需将i转换为int,它已经是int
  • 第一个循环:从1开始索引i而不是0,不避免空行
  • 第二个循环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));
}

答案 2 :(得分:1)

以下是另一种解决方案,您可以提取接受printstart的{​​{1}}方法。如果它们之间有stop,则在index打印字符,否则打印空格。

index

答案 3 :(得分:0)

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

Try it online!

k

输出:

x[0]

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

答案 4 :(得分:0)

此代码适用于常规 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);
}

输出:

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