2014-09-20 64 views
0

如何將我的調用更改爲函數collat​​e,我希望它打印出collat​​e(「hello」,「there」)是「htehlelroe」。從一個類中調用函數「整理」

public class Collate { 

    public static void main(String[] args) { 
     String a = new String("hello"); 
     String b = new String("there");   
    } 

    public String collate(String a, String b) { 
     String collate = new String(); 
     for (int i = 0; i < a.length(); i++) { 
      collate = collate + a.substring(i); 
      collate = collate + b.substring(i); 
      collate(a, b); 
      System.out.println(collate); 
     } 
     return collate; 
    } 
} 
+2

你無限地調用collat​​e,因爲你總是用相同的參數(a,b)在它內部調用它,而不是改變任何狀態。如果您執行它,程序將崩潰。另外,如果你想從main方法中調用collat​​e,你必須聲明它是靜態的,或者實例化一個你可以調用collat​​e的Collat​​e對象。 (靜態方法不能調用非靜態方法) – 2014-09-20 00:46:04

+1

也可以用'charAt(i)'替換'substring(i)'' – mariusm 2014-09-20 00:50:43

+0

您不必要地創建遞歸(自己調用方法)。你的'collat​​e(a,b)'應該放在'main'裏面,'collat​​e()'方法本身應該是'static'。 – 2014-09-20 00:51:43

回答

0

做這樣的

public class Collate { 

    public static void main(String[] args) { 
     String a = new String("hello"); 
     String b = new String("there");   
     System.out.print(collate(a,b)); 
    } 

    public static String collate(String a, String b) { 
     String collate = new String(); 
     for(int i=0;i<a.length();i++){ 
      collate += a.charAt(i); 
      collate += b.charAt(i); 
     } 

     return collate; 
    } 
} 
0

下面的代碼應該做你想要什麼。

我們有什麼,在你的代碼改變:

  • 整理必須是靜態的,如果我們想直接從另一個靜態方法,即調用它,主要

  • 你遞歸調用整理具有相同的論點。事實上,我們只是想整理字符串的提醒(一旦我們採取了第一個字符

  • 你簡單地假設a和b是相等的長度,只是試圖循環的長度a。你應該總是陳述你對某個方法論點的假設,如果你打電話給你的比較方法的長度超過b,你可能不會得到你想要的東西

  • 不應該調用新的String(「something」)。這將創建一個字符串類型的新實例,Java中的字符串是不可變的,所以沒有理由這樣做,雖然新的String()不會影響程序的語義,但會對其性能產生嚴重影響,特別是,如果你正在循環中創建字符串,

    公共類分頁{

    public static void main(String[] args) { 
        String a = "hello"; 
        String b = "there"; 
        System.out.println(collate(a, b)); 
    } 
    public static String collate(String a, String b) { 
        if (a.length() != b.length()) 
         throw new IllegalArgumentException("Cannot collate strings of unequal size"); 
        if (a.isEmpty()) 
         return ""; 
        else { 
         String collate = ""; 
         StringBuilder result = new StringBuilder(); 
         char firstCharacterOfA = a.charAt(0); 
         char firstCharacterOfB = b.charAt(0); 
         result.append(firstCharacterOfA); 
         result.append(firstCharacterOfB); 
         result.append(collate(a.substring(1), b.substring(1))); 
         return result.toString(); 
        } 
    } 
    

    }

編輯:請注意,遞歸有可能在這裏殺了你的應用程序。如果你傳遞的字符串很大,你可以運行一個StackOverflow。此外,性能會受到影響,因爲方法調用有一些小的成本。

如果你寫你的方法迭代,例如,像Ankush一樣使用for循環,你將不會有這樣的問題。