通过使用字符串替代StringBuilders?

时间:2014-02-18 08:27:10

标签: java string

目前我有这个......

 public static String repeatLetters(int multiplier, String text)
{  
  StringBuilder repeat = new StringBuilder();

  for (int i = 0; i < text.length(); i++)
  {
     for (int j = 0; j < multiplier; j++)
     { 
        repeat.append(text.charAt(i));
     }
  }

  System.out.println("Letters Repeated:");
  System.out.println("-----------");
  System.out.println(repeat);
  System.out.println("--------------");

  return repeat.toString();
}

我想以这样的方式编写代码,即当前读取的最后一个语句“return repeat.toString();”只是“回报价值”。我怎样才能构建这个代码来做到这一点?有没有办法在不使用StringBuilders并只使用字符串的情况下执行此操作?

3 个答案:

答案 0 :(得分:1)

在您的特殊情况下,您可以简化代码。但在大多数情况下,使用StringBuilder是更好的选择。并且“直接使用String”根本不是一个选择。

public static String repeatLetters(int multiplier, String text) {
    final int numChars=text.length();
    char[] data=new char[numChars*multiplier];
    for(int i=0, j=0, k=multiplier; i<numChars; i++, j=k, k+=multiplier)
        Arrays.fill(data, j, k, text.charAt(i));
    return new String(data);
}

答案 1 :(得分:0)

在Java 8中:

public static String repeatChars(final String in, int numTimes) {
    return IntStream.range(0, in.length()).
            mapToObj(Integer::valueOf).
            flatMap((index) -> IntStream.range(0, numTimes).mapToObj((rep) -> String.valueOf(in.charAt(index)))).collect(Collectors.joining());
}

这基本上做同样的事情。它也使用一个StringBuilder,所以应该只比显式使用一个效率低一点 - 它必须在过程中创建相当多的String个对象但是应该在迭代中共享相同的String(在重复中)。

基本上我们采用范围IntStream的{​​{1}},对于每个[0, in.length),我们将其转换为int,然后Integer转换为flatMap我们将每个IntStream映射到[0, numTimes)的范围int;即我们在第一个String.valueOf(in.charAt(index))的当前点重复第二个中每个元素的字符。然后,我们使用StreamStream收集到String

答案 2 :(得分:-1)

效率低但

public static String repeatLetters(int multiplier, String text)
{  
  String repeat = new String();

  for (int i = 0; i < text.length(); i++)
  {
     for (int j = 0; j < multiplier; j++)
     { 
        repeat+=text.charAt(i);
        //Or maybe repeat+=new String(text.charAt(i));
     }
  }

  System.out.println("Letters Repeated:");
  System.out.println("-----------");
  System.out.println(repeat);
  System.out.println("--------------");

  return repeat;
}

每次分配字符串时,实际上都会分配一个新对象并将旧对象发送到垃圾回收集