2016-01-20 41 views
2

我應該從主方法(s1,s2,s3和s4中的掃描程序中抓取4個字符串 - 主方法在測試完成後完美工作)並調用這個:我在這種方法做錯了什麼? (使用StringBuilder從4個字符串中創建一個新單詞)

- > concat(s1,s2,s3,s4);

方法名稱concat可能是誤導性的,因爲我不只是想要s1+s2+s3+s4。我真正需要的是從s1開始,然後添加s2,s3s4中尚未出現在結果String中的字符。例如,如果是s1「漏極」和s2是「丹麥人」時,處理後s2部分結果將是「draine」自dan已經存在於結果String

這裏是方法:

public static void concat(String s1, String s2, String s3, String s4) { 

     String str; 
     StringBuilder createdWord = new StringBuilder();  

     for (int i = 0; i < s1.length(); i++) { 
     char c = s1.charAt(i); 
     for (int j = 0; j < createdWord.length(); j++) { 
      if (createdWord.charAt(j) != c) 
       createdWord.append(c);    
     }     
     } 

     for (int i = 0; i < s2.length(); i++) { 
     char c = s2.charAt(i); 
     for (int j = 0; j < createdWord.length(); j++) { 
      if (createdWord.charAt(j) != c) 
       createdWord.append(c);    
     }   
     } 

     for (int i = 0; i < s3.length(); i++) { 
     char c = s3.charAt(i); 
     for (int j = 0; j < createdWord.length(); j++) { 
      if (createdWord.charAt(j) != c) 
       createdWord.append(c);    
     }   
     } 

     for (int i = 0; i < s4.length(); i++) { 
     char c = s4.charAt(i); 
     for (int j = 0; j < createdWord.length(); j++) { 
      if (createdWord.charAt(j) != c) 
       createdWord.append(c);    
     }   
     } 

     str = createdWord.toString(); 
     System.out.println(str); 

    } 

當我嘗試打印(STR),我得到了一個空白的輸出。我肯定有一種方法可以使這個更簡單。

我會接受基於清晰度,簡單性和/或更簡單解決方案的答案。提前致謝!

+0

我剛剛進行了編輯,從其中一個答案的評論中引入了您的觀點。我有沒有得到它,還是還有一些需要表達的微妙之處? –

+1

是的,這很有道理。我看到了混亂的地方。謝謝,埃裏克,這是一個非常糟糕的名稱選擇來調用我的方法。 –

回答

2

的問題是在你有線for循環:

for (int j = 0; j < createdWord.length(); j++) 

由於createdWord只是初始化,它的長度是零(0),從而createdWord.length()= 0,並且內部的代碼for循環永遠不會到達。 你應該嘗試解決這個問題。

編輯 那麼這裏是多麼簡單,我會重構concat方法。我還提供了一個主要的和4個字符串來測試。按照OP意見,預期系統出將是 「drainemv」

public static void main(String[] args) { 
    String str1 = "drain"; 
    String str2 = "dane"; 
    String str3 = "main"; 
    String str4 = "vain"; 

    concat(str1, str2, str3, str4); 

} 
public static void concat(String s1, String s2, String s3, String s4) { 

    String str; 
    StringBuilder createdWord = new StringBuilder(); 

    for (int i = 0; i < s1.length(); i++) { 
     char c = s1.charAt(i); 
     if(createdWord.length() ==0) { 
      createdWord.append(c); 
     } else if (!createdWord.toString().contains(String.valueOf(c))){ 
      createdWord.append(c); 
     } 

    } 

    for (int i = 0; i < s2.length(); i++) { 
     char c = s2.charAt(i); 
     if(createdWord.length() ==0) { 
      createdWord.append(c); 
     } else if (!createdWord.toString().contains(String.valueOf(c))){ 
      createdWord.append(c); 
     } 

    } 

    for (int i = 0; i < s3.length(); i++) { 
     char c = s3.charAt(i); 
     if(createdWord.length() ==0) { 
      createdWord.append(c); 
     } else if (!createdWord.toString().contains(String.valueOf(c))){ 
      createdWord.append(c); 
     } 

    } 

    for (int i = 0; i < s4.length(); i++) { 
     char c = s4.charAt(i); 
     if(createdWord.length() ==0) { 
      createdWord.append(c); 
     } else if (!createdWord.toString().contains(String.valueOf(c))){ 
      createdWord.append(c); 
     } 

    } 


    str = createdWord.toString(); 
    System.out.println(str); 

} 
+0

好的電話。你絕對正確。你有什麼建議可以解決OP問題嗎? –

+1

謝謝,非常棒!在對我的代碼進行多次編輯之後,我正在嘗試在使用StringBuilder之前執行此操作,並將其放在那裏...我將其更改爲與現在嵌套for循環中的s1,s2,s3和s4相同的長度,在用戶輸入第4個字之後得到「線程中的異常」主「java.lang.StringIndexOutOfBoundsException:字符串索引超出範圍:0」...即使編譯正確。 –

+0

在哪一行是拋出的Exception? (請記住,我們無法確定給您的線路分配了哪些號碼。) –

0

我相信這個問題已經查明,但這裏是更簡單的方法:

String s1 = "bla"; 
    String s2 = "yata"; 
    String s3 = "test"; 
    String s4 = "moretest"; 

    String[] sr = new String[]{s1, s2, s3, s4}; 

    StringBuilder sbNewWord = new StringBuilder(); 

    sbNewWord.append(sr[0]); 

    for(int ndx=1; ndx<sr.length; ndx++) { 
     for(char c : sr[ndx].toCharArray()) { 
      if(sbNewWord.toString().indexOf(c) == -1) { 
       sbNewWord.append(c); 
      } 
     } 
    } 

OUTPUT:

新詞:blaytesmor

0

在這裏使用一些Java 8功能是如何做到這一點。
LinkedHashSet保留插入順序。

import java.util.*; 

class Test003 { 
    public static void main(String[] args) throws java.lang.Exception { 
     String s1 = "test"; 
     String s2 = "test24m"; 
     String s3 = "test1"; 
     String s4 = "test3"; 

     LinkedHashSet<Character> hs = new LinkedHashSet<Character>(); 
     hs.addAll(Arrays.asList(s1.chars().mapToObj(c -> (char) c).toArray(Character[]::new))); 
     hs.addAll(Arrays.asList(s2.chars().mapToObj(c -> (char) c).toArray(Character[]::new))); 
     hs.addAll(Arrays.asList(s3.chars().mapToObj(c -> (char) c).toArray(Character[]::new))); 
     hs.addAll(Arrays.asList(s4.chars().mapToObj(c -> (char) c).toArray(Character[]::new))); 

     StringBuilder b = new StringBuilder(); 
     hs.forEach(b::append); 
     System.out.println(b); 
    } 
} 

而這裏是你如何做到這一點,沒有Java 8的功能。

import java.util.Arrays; 
import java.util.Iterator; 
import java.util.LinkedHashSet; 

public class Test004 { 

    public static void main(String[] args) throws java.lang.Exception { 
     String s1 = "test"; 
     String s2 = "test24m"; 
     String s3 = "test1"; 
     String s4 = "test3"; 

     LinkedHashSet<Character> hs = new LinkedHashSet<Character>(); 
     hs.addAll(Arrays.asList(toCharacterArray(s1.toCharArray()))); 
     hs.addAll(Arrays.asList(toCharacterArray(s2.toCharArray()))); 
     hs.addAll(Arrays.asList(toCharacterArray(s3.toCharArray()))); 
     hs.addAll(Arrays.asList(toCharacterArray(s4.toCharArray()))); 

     StringBuilder b = new StringBuilder(); 
     Iterator<Character> it = hs.iterator(); 
     while (it.hasNext()){ 
      b.append(it.next()); 
     } 
     System.out.println(b); 
    } 

    private static Character[] toCharacterArray(char[] c){ 
     Character[] result = new Character[c.length]; 
     for (int i=0; i<c.length; i++){ 
      result[i] = c[i]; 
     } 
     return result; 
    } 
} 
相關問題