我目前正在尝试生成一个60星的系列 但我发现了几种方法。
//Method 1
System.out.println(String.format("%60s", "").replace(' ', '*'));
//Method 2
for(int i=0;i<60;i++)
System.out.print("*");
System.out.println("");
//Method 3
int i=0;
while(i<60) {
System.out.print("*");
i++;
}
哪种方法最好? (在时间和风格方面)
如果有其他方法可以做到这一点?
//Modular Approach, not bad
static String repeat(final String str, final int n) {
final int len = (str == null) ? 0 : str.length();
if (len < 1 || n < 1) {
return "";
}
final StringBuilder sb = new StringBuilder(len * n);
for (int i = 0; i < n; i++) {
sb.append(str);
}
return sb.toString();
}
System.out.println(repeat("*", 60));
并且
//Similar to method 1
System.out.println(new String(new char[60]).replace("\0", "*"));
答案 0 :(得分:8)
怎么样:
Stream.generate(() -> "*").limit(60).forEach(System.out::print);
System.out.println(); // for the newline at the end
或稍微hacky,但一行:
System.out.println(new String(new char[60]).replace("\0", "*"));
hacky版本的工作原理是因为所有元素的java数组都是在所有元素中用值0初始化的,然后每个元素都用String中的所需字符替换一次。
答案 1 :(得分:2)
在所提出的方法中,第一种方法可能表现最佳,因为它不需要循环并且只调用print
一次。但是这种过早优化的气味。循环(for
或while
或do-while
)的选择几乎肯定会被编译器和JIT优化(取决于平台和版本)。但是,我更愿意采用第四种方法。 merging documents。在这种情况下,我会使用Write Dumb Code构建String
,然后打印出来。像,
static String repeat(final String str, final int n) {
final int len = (str == null) ? 0 : str.length();
if (len < 1 || n < 1) {
return "";
}
final StringBuilder sb = new StringBuilder(len * n);
for (int i = 0; i < n; i++) {
sb.append(str);
}
return sb.toString();
}
然后
System.out.println(repeat("*", 60));
答案 2 :(得分:2)
效率最高?怎么样:
int n=60;
char[] data = new char[60];
for(int i=0; i<n; i++)
data[i] = '*';
System.out.print(data);
只生成了一个对象,并且只打了一次&#34; print&#34;。
答案 3 :(得分:2)
除非你需要能够轻松修改星星的数量,否则我真诚地使用
System.out.println("************************************************************");
或者,如果您需要多次使用星星,我认为这很可能,
String sixtyStars = "************************************************************";
然后您可以将sixtyStars
传递给您需要的任何打印方法。
答案 4 :(得分:1)
在我看来。 。我认为M1比使用循环更好更快。但是,M2是最简单的理解方式。 您也可以使用
添加M4 PrintStart (60);\\ on call
\\function body
public static void PrintStart ( int i){
if (i==0)
return;
System.out.print ("*");
PrintStart (i-1);
}
答案 5 :(得分:0)
就时间复杂度而言,它们是相同的:O(n)。 但M2 = M3比M1好(它实际上包含循环 - 你必须看到String.format和String.replace的源代码)。
就空间复杂性而言,M.2更好。
在这个问题中,M.2就足够了,可以通过使用StringBuilder进行改进。
答案 6 :(得分:0)
如何使用自定义collector?
String result = IntStream.range(0, 60).mapToObj(i -> '*')
.collect(Collector.of(
StringBuilder::new,
StringBuilder::append,
StringBuilder::append,
StringBuilder::toString));
或加入字符串
一样String result = IntStream.range(0, 60).mapToObj(i -> "*")
.collect(Collectors.joining());
答案 7 :(得分:0)
这是我经常使用的一个 - 使用Java 8流:
Stream.generate(() -> "*").limit(60).collect(Collectors.joining());
对我而言,它很好地捕获了意图:生成一个星号流,获得前60个并将它们连接在一起。