2017-05-24 79 views
0

假設:如何合併兩個字符串爲一個字符串在Java中

String s1="13579"; 
String s2="2468"; 

然後輸出將123456789

這裏我的代碼:

public class JoinString { 

    public static void main(String[] args) { 

     String s1 = "13579"; 
     String s2 = "2468"; 
     for (int i = 0; i < s1.length(); i++) { 
      for (int j = i; j < s2.length(); j++) { 

       System.out.print(s1.charAt(i) + "" + s2.charAt(j)); 
       break; 
      } 
     } 
    } 
} 
+5

什麼是你的推理'break'? – Tom

+5

你並不需要兩個嵌套循環。只需要一個循環跟蹤兩個字符串的索引就足夠了。一旦你用完了較短的一個,你可以根據你得到的距離添加一個更長的子串。 – azurefrog

+0

如果我沒有使用break語句,那麼op將是12141618343638565878。 –

回答

3
StringBuilder buf = new StringBuilder(); 
for (int i = 0; i < Math.max(s1.length(), s2.length()); i++) { 
    if (i < s1.length()) { 
     buf.append(s1.charAt(i)); 
    } 
    if (i < s2.length()) { 
     buf.append(s2.charAt(i)); 
    } 
} 
final String result = buf.toString(); 

你只需要一個循環。另外,您可以使用StringBuilder類來逐個字符地構建您的字符串。

1

你只需要像這樣結合兩個循環的邏輯(如果你想用這種方式構建一個字符串,可以使用StringBuilder)。

String s1 = "13579"; 
    String s2 = "2468"; 
    int length = Math.max(s1.length(), s2.length()); 
    for (int i = 0; i < length; i++) { 
     if(i < s1.length()) 
      System.out.print(s1.charAt(i)); 

     if(i < s2.length()) 
      System.out.print(s2.charAt(i)); 
    } 
+0

這對s1的雙重檢查可能有點多餘。length()'和's2.length()'。 –

+0

@ChrisGilardi true ...打破了這一點,以便while循環在做零件時只做很少的工作。 – Tezra

0

到@Roman Puchovskiy類似,這裏是一個辦法做到這一點沒有StringBuilder

String s1 = "abcde"; 
    String s2 = "defgh"; 
    String combined = ""; 
    int length = s1.length() > s2.length() ? s1.length() : s2.length(); //Finds the longest length of the two, to ensure no chars go missing 
    for(int i = 0 ; i < length ; i++) { 
     if(i < s1.length()) { // Make sure there is a char in s1 where we're looking. 
      combined += s1.charAt(i); 
     } 
     if(i < s2.length()) { // Same with s2. 
      combined += s2.charAt(i); 
     } 
    } 

其中combined成爲組合字符串。 ("adbecfdgeh")。

希望這會有所幫助!

+1

請注意,這會產生大量垃圾:每個'+ ='都有一個字符串對象,因此每個結果字符串都有一個對象。 GC可能不開心。 –

+0

@RomanPuchkovskiy感謝您的洞察力,我不知道這是事實。不過,我剛剛在[這個答案](https://stackoverflow.com/a/4323132/4914803)中讀過它並不重要,因爲Java的編譯器足夠聰明,可以將它變成一個StringBuilder。無論哪種方式,謝謝! –

+2

@ChrisGilardi編譯器確實這樣做了,但是每次循環運行時都會調用'toString',而使用'StringBuilder'時只會發生一次。在這裏可能不會通知,但這確實需要比'StringBuilder'解決方案更多的內存。對於單一聲明,這並不重要。但是在循環內,它會產生相當大的差異。 –

3

這個怎麼樣小竅門:

String s1 = "13579"; 
String s2 = "2468"; 

String s3 = (s1 + s2).codePoints() // stream of code points 
    .sorted() 
    // collect into StringBuilder 
    .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) 
    .toString(); 

System.out.println(s3); // 123456789 
+0

但是,只有輸入嚴格排序纔有效。我們真的可以假設情況總是如此嗎? – azurefrog

+0

@azurefrog我只是想知道這件事。 tbh我認爲這是整個問題,以獲得排序的輸出。 –

+0

嗯,好的一點,回頭看,OP的問題可以被解讀爲「每隔一個字符」或「排序後的輸出」,這有點含糊不清。 – azurefrog

2

一種簡單的方式來實現這一目標是做這樣的事情:

String s1 = "13579"; 
String s2 = "2468"; 
char[]result = (s1+s2).toCharArray(); 
Arrays.sort(result); 
System.out.println(result); 

輸出:

123456789 
+1

但是,只有在輸入嚴格排序的情況下才有效。我們真的可以假設情況總是如此嗎? – azurefrog

+0

@azurefrog你是什麼意思*嚴格排序* ?,我用OP提到的例子。 – Yahya

+0

沒錯,請參閱我對@Jorn Vernee的回答的回覆。 OP的問題不明確。 – azurefrog

0

類似的方式作爲合併排序中的合併方法。

另外,如果將字符串轉換爲char數組,以便隨機訪問元素的時間不變,那麼它會更好。 因爲charAt具有O(n)時間複雜度。

public class JoinString { 

public static void main(String[] args) { 

    String s1 = "13579"; 
    String s2 = "2468"; 
    final char[] str1 = s1.toCharArray(); 
    final char[] str2 = s2.toCharArray(); 
    int i; 
    for (i = 0; i < str1.length && i < str2.length; i++) { 
     System.out.print(str1[i] + "" + str2[i]); 
    } 

    while (i < str1.length) { 
     System.out.print(str1[i] + ""); 
     i++; 
    } 

    while (i < str2.length) { 
     System.out.print(str2[i] + ""); 
     i++; 
    } 
} 

}

+0

對於'String','StringBuffer'和'StringBuilder','charAt()'是一個常量操作。 https://stackoverflow.com/questions/6461402/java-charat-and-deletecharat-performance –