目前我有这个......
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并只使用字符串的情况下执行此操作?
答案 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))
的当前点重复第二个中每个元素的字符。然后,我们使用Stream
将Stream
收集到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;
}
每次分配字符串时,实际上都会分配一个新对象并将旧对象发送到垃圾回收集