2017-10-05 14 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)を入れ替えることだけです。

もう1つのオプションは、あなたが探して管理しているリストの位置をより制御しやすいようにforループを使用することです。

+0

私は、再帰でarraylistsを理解するために再帰でこれを実行しようとしています。また、このメソッドはスーパークラスからのものであるため、メソッドの戻り値の型を変更しようとしていません。ヘルパーメソッドは良いでしょうか? –

0

あなたは再帰を主張していますか?問題は元のリストを変更することで、最後の行addStars(str.subList(2, str.size()))は毎回長いリストからサブリストを作成しているため、再帰が終了することはありません。このアプローチに従うには、インデックスを導入して毎回増分する必要があります。

+0

私はarraylistsと再帰をよりよく理解しようとしています。私はこれがループでずっと簡単にできることを知っています。 –

関連する問題