2017-10-05 57 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递归。我知道这可以通过循环更容易完成。 –