2017-10-05 81 views
1

我想寫一個遞歸方法來在字符arraylist中的字符之間添加星號。我也試圖避免該方法中的硬編碼。這是我的測試代碼和所需輸出的嘗試。我想使用列表迭代器,但我想知道是否有更好的方法?遞歸添加星號字符

public static String addStars(List<Character> str) { 
    if (str.isEmpty()) { 
     return ""; 
    } 

    else { 

     char hold = '*'; 

     str.listIterator(1).add(hold); 

     str.listIterator(3).add(hold); 

    } 

    return str.get(0) + addStars(str.subList(2, str.size())); 
} 

public static void main(String[] args) { 

ArrayList<Character> example = new ArrayList<>(Arrays.asList('a', 'b', 'c')); 
    System.out.println(example); // [a, b, c] 
    System.out.println(addStars(example)); // a*b*c 
    System.out.println(example); // [a, *, b, *, c] 
} 

}

+0

那麼究竟是什麼問題呢? – Mureinik

+0

我的程序沒有輸出我想要的內容。我想知道是否有更實際的解決方案。 –

+0

你想修改現有的列表嗎?或者返回一個新的列表?一般來說,修改變量是一個危險的操作。 – corsiKa

回答

1

這應該這樣做。

public class Whatever { 
    private final static char hold = '*'; 

    public static String addStars(List<Character> str) { 
     if (str.isEmpty()) { 
      return ""; 
     } else if (str.size() < 2) { 
      //Don't add star after last character 
      return "" + str.get(0); 
     } 

     //Add only one star per iteration 
     str.listIterator(1).add(hold); 
     List<Character> sublist = str.subList(2, str.size()); 
     return "" + str.get(0) + hold + addStars(sublist); 
    } 

    public static void main(String[] args) { 
     ArrayList<Character> example = new ArrayList<>(Arrays.asList('a', 'b', 'c')); 
     System.out.println(example); // [a, b, c] 
     System.out.println(addStars(example)); // a*b*c 
     System.out.println(example); // [a, *, b, *, c] 
    } 
} 
+0

我試過了,但輸出結果看起來不對。 –

+0

[a,b,c] 139140c [a,b,c]是我編輯推出的 –

+0

我修正了這個問題,現在就試試。 –

0

這應該這樣做

public static void addStars(int offset, List<Character> str) { 
    if (offset < str.size()) { 
     str.add(offset, '*'); 
     addStars(offset + 2, str); 
    } 
} 

public static void main(String[] args) { 

ArrayList<Character> example = new ArrayList<>(Arrays.asList('a', 'b', 'c')); 
    System.out.println(example); // [a, b, c] 
    addStars(1, example); 
    System.out.println(example); // [a, *, b, *, c] 
} 

}

+0

是否可以用一個輔助方法來完成,因爲我不想更改方法返回類型或測試代碼? –

+0

當使用遞歸時,大多數情況下你不得不使用返回類型,因爲它會在每個要避免的遞歸調用的堆上創建一個對象。遞歸是使用堆棧實現的。 沒問題,但如果你返回一個現有的對象,如列表 str – uvo

+0

我只是想知道由於這種方法是從一個超類,這也是我正在其他類中實現的。 –

0
public static void addStars() { 
    ArrayList<Character> example = new ArrayList<>(Arrays.asList('a', 'b', 'c')); 
    List<Character> modList = new ArrayList<Character>(); 
    //There is where the magic happens. 
    char CHAR_TO_ADD = '*'; 

    //Interating over the characters 
    for (char temp : example) { 
     modList.add(CHAR_TO_ADD); 
     modList.add(temp); 

    } 

    for (char temp : modList) { 
     System.out.print(temp + " "); 
    } 
} 

我認爲你正在尋找這樣的事情。 我已經包括了每個鬆散的因爲它們處理列表時更容易。如果你想在最後修剪最後一個角色,這樣你就可以在每個角色之前留下一顆星星。所有如果你需要做的是交換staredList.add(temp)和staredList.add(CHAR_TO_ADD)。

另一種選擇是使用for循環,這樣您可以更好地控制您正在查看和管理的列表的位置。

+0

我試圖用遞歸來做到這一點,以更好地理解遞歸的數組列表。我也沒有試圖修改方法返回類型,因爲這個方法來自超類。輔助方法會更好嗎? –

0

你堅持遞歸嗎?問題是你正在改變原始列表,最後一行addStars(str.subList(2, str.size()))每次都從較長的列表創建子列表,所以你的遞歸永遠不會結束。如果你想遵循這種方法,你應該引入一些索引並且每次增加。

+0

我想更好地理解與arraylists遞歸。我知道這可以通過循環更容易完成。 –