JAVA生成一行“*”的最佳方式

时间:2015-11-13 03:42:16

标签: java

我目前正在尝试生成一个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", "*"));

8 个答案:

答案 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一次。但是这种过早优化的气味。循环(forwhiledo-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个并将它们连接在一起。