我正在网上练习一些Java练习,遇到了一个可以这样打印字符串"DIAGONALLY"的练习:
D I A G O N A L L Y
我做完了没有问题。然后我决定尝试像这样打印出来:
D I A G O N A L L Y
这是我到目前为止尝试过的:
public class Examples {
public static void main(String[] args) {
String d = "DIAGONALLY";
String s = "";
for (int i = 0; i < d.length(); i++) {
System.out.printf("%s%sn", s, d.charAt(i));
if (i < 6)
s = s + " ";
else
s = s - " ";
}
}
}
现在显然"else s = s - ";"部分是错误的,但我现在只是把它放在那里,因为我不知道如何从字符串中减去一个空格。我将如何从右向左对角线打印 d 的子字符串?
不能从字符串中减去字符,但可以使用 substring()
方法提取字符串的一部分,该方法采用两个参数:要包含在"剪切"中的第一个字符的索引,以及要包含的最后一个字符之后的第一个字符的索引。
但是,在这种情况下,最好为每行生成一个新。 (抱歉,语言混淆:该构造函数存在于 C# 中,但不存在于 Java 中。String
:new String(' ', x)
将为您提供一个由x
空格组成的String
稍后(当您开始编写处理大量数据的较大程序时),请注意字符串连接 ( +
) 和 substring()
字符串越大越慢。如果需要逐渐操作大字符串,则应使用 StringBuffer
或 StringBuilder
。
使用 substring()
public String substring(int beginIndex)
返回一个新字符串,该字符串是此字符串的子字符串。子字符串以指定索引处的字符开头,并延伸到此字符串的末尾。
你的代码有一个错误,我应该少 5
public class Examples {
public static void main(String[] args) {
String d = "DIAGONALLY";
String s = "";
for (int i = 0; i < d.length(); i++) {
System.out.printf("%s%sn", s, d.charAt(i));
if (i < 5)
s = s + " ";
else
s = s.substring(1);
}
}
}
public class Examples {
public static void main(String[] args) {
String d = "DIAGONALLY";
StringBuilder s = new StringBuilder("");
for (int i = 0; i < d.length(); i++) {
System.out.printf("%s%sn", s, d.charAt(i));
if (i < (d.length()+1)/2)
s.append(" ");
else
s.setLength(s.length()-1);
}
}
}
StringBuilder
就像一个可扩展的String
。您可以根据需要随时添加.append()
。您还可以设置其长度。所以为了做你的s = s - " "
,我只是将其长度设置为比上次少一个。
我还将您的硬编码长度 6 更改为 d 字符串长度的一半(加上 1 以使数学工作),以便它适用于任何字符串。
当然,它不是新技术,而是不同的。
String d = "DIAGONALLY";
String s = "";
for (int i = 0; i < d.length(); i++) {
//System.out.printf("%s%s", s, d.charAt(i));
System.out.println(s+d.charAt(i));
if (i <6)
s = s + " ";
else
s = s.substring(0,s.lastIndexOf(" "));
}