我有一个任务要求用户输入(用户名),然后从中打印出菱形图案。 例如: 如果用户的名字是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));
}
}
}
}
感谢您的时间和帮助!
答案 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
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)
以下是另一种解决方案,您可以提取接受print
和start
的{{1}}方法。如果它们之间有stop
,则在index
打印字符,否则打印空格。
index
答案 3 :(得分:0)
答案 4 :(得分:0)
此代码适用于常规 UTF8 字符和代理对。
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);
}
输出:
?
??
???
????
?????
??????
???????
??????
?????
????
???
??
?