2015-09-19 99 views
-1

我被要求编写一个传递了字符串的方法,然后返回一个字符串,每个字符加倍。我在之前问过的问题上找到了代码,但我想知道为什么s.charAt(i)必须添加两次。java中字符串的加倍字母

我使用的代码是:

public static String twoChars(String s){ 
    String r= ""; 
    for(int i=0; i<s.length(); i++) 
      r=r+s.charAt(i)+s.charAt(i); 
    return r; 
    } 
+3

什么是 “翻倍” 对你意味着什么? –

+0

对于简短的字符串,字符串的添加并不重要,但是当循环中添加字符而不是插入(预初始化的)'StringBuilder'时,它仍然会伤害我的眼睛。 –

+0

@JamesKPolk谢谢!我不知道我错过了什么,我只是开始编程,循环真的让我困惑。附:爱你的用户名 – Maria

回答

0

因为r是空的,则该方法返回之前把每个字符的两倍至r。更好的办法是使用StringBuilder为:

public static String twoChars(String s){ 
    StringBuilder sb=new StringBuilder(); 
    for(int i=0; i<s.length(); i++) 
      sb.append(s.charAt(i)+ "" +s.charAt(i)); 
    return sb.toString(); 
} 
+0

's.charAt(i)+“”+ s.charAt(i)'仍然会创建许多字符串,这会破坏使用'StringBuilder'的目的 – async

1

如果按照程序逻辑,你会看到,会出现以下情况:

1) pass a string (for example "hello") 
2) start another empty string (String r = "") 
3) when i==0, r becomes: ""+ h + h 
4) when i==1, r becomes: hh + e + e 
5) etc. 
6) return "hheelloo" 

注意:正如前文所述,使用StringBuilder的是一个更好的解决方案,因为字符串是不可变的(每次更改r时,都会创建一个新字符串,从而浪费宝贵的资源)。

0

那么这里是如何思考这个问题以及要记住的。

首先,Java中的String是不可变的。在String上进行的所有修改将导致创建新的String。如果您对很多字符串进行了大量修改,这可能会造成问题,从而导致大量的内存使用量。一定要记住这一点,尤其是当你有更换字符串的循环时。

现在回到问题。给定一个Strings,你想“加倍”每一个字符。由于您必须检查s的每个字符,因此您可能需要一个循环。

你还需要什么?那么,你需要某种结构来构建新的String。你可以去StringBuilderchar[]。 A StringBuilder就是这样做的:构建字符串。然而,它是以一种高效的方式建立起来的。实际上它包含一个char[]

这里的StringBuilder解决方案:

String input = "hello"; 

StringBuilder builder = new StringBuilder(input.length() * 2); 

for(int i = 0; i < input.length(); i++) 
{ 
    builder.append(input.charAt(i)).append(input.charAt(i)); 
} 

String finalString = builder.toString(); 

这里有一个char[]解决方案

String input = "hello"; 

char[] tempChar = new char[input.length() * 2]; 

for(int i = 0; i < input.length(); i++) 
{ 
    tempChar[2 * i] = input.charAt(i); 
    tempChar[2 * i + 1] = input.charAt(i); 
} 

String output = new String(tempChar);