2017-10-26 11 views
2

これは、連続する重複を削除する必要がある私のコードです。再帰呼び出しのIndexOutOfBoundsException

パッケージPractice.Practice;

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import java.util.Scanner; 

public class RemoveConsecutiveDuplicates { 
    private static int i=1; 
    public static List<String> detectDuplicates(List<String> chars) { 
     if(i>chars.size()) 
      return chars; 
     while(chars.get(i-1).equals(chars.get(i))) { 
      chars.remove(i); 
     } 
     i++; 
     return detectDuplicates(chars); 


    } 

    public static void main(String[] args) { 
     Scanner scanner = new Scanner(System.in); 
     String str = scanner.nextLine(); 
     List<String> chars = new ArrayList<String>(Arrays.asList(str.split(""))); 
     System.out.println(detectDuplicates(chars)); 

    } 
} 

入力 "asssddaaffgff"に対して例外がスローされました。 asssddaaffgffスレッドで

例外 "メイン" java.lang.IndexOutOfBoundsException: インデックス:7、サイズ:7 java.utilの でここ

がスローされた例外です。 実践でPractice.Practice.RemoveConsecutiveDuplicates.detectDuplicates(RemoveConsecutiveDuplicates.java:13) でjava.util.ArrayList.get(ArrayList.java:429)でArrayList.rangeCheck(ArrayList.java:653)。 実践でPractice.Practice.RemoveConsecutiveDuplicates.detectDuplicates(RemoveConsecutiveDuplicates.java:17) でPractice.Practice.RemoveConsecutiveDuplicates.detectDuplicates(RemoveConsecutiveDuplicates.java:17) でPractice.RemoveConsecutiveDuplicates.detectDuplicates(RemoveConsecutiveDuplicates.java:17) でPractice.Practice.RemoveConsecutiveDuplicates.detectDuplicates(RemoveConsecutiveDuplicates.java:17) でPractice.Practice.RemoveConsecutiveDuplicates.detectDuplicates(RemoveConsecutiveDuplicates.java:17) で.Practice.RemoveConsecutiveDuplicates.detectDuplicates(RemoveConsecutiveDuplicates.java:17) Pあなたは1を削除するとractice.Practice.RemoveConsecutiveDuplicates.main(RemoveConsecutiveDuplicates.java:26)

+1

'場合(I> = chars.size())' - 簡単な変更? –

答えて

1

問題がwhileループである:ここでは

while(chars.get(i-1).equals(chars.get(i))) 

あなたは要素を削除しています。したがって、Listのサイズ、したがってchars.size()メソッドによって返される値が変化します。次のように

変更whileループ:

public static List<String> detectDuplicates(List<String> chars) { 
    while(i<chars.size() && chars.get(i-1).equals(chars.get(i))) { 
     chars.remove(i); 
    } 
    i++; 

    if(i>chars.size()) return chars; 
    return detectDuplicates(chars); 
} 
+0

は多くのことを助けます –

1

あなたはchars.size()が変化しているので、whileループのチェックを行う必要があります。あなたは自分の中でそれをすることができます。

... 
while((i<chars.size()) && (chars.get(i-1).equals(chars.get(i)))) { 
    chars.remove(i); 
} 
i++; 
return detectDuplicates(chars); 
... 
+1

あなたは 'i Bernat

+0

本当に 'i'が' chars.size'より大きい場合、 'chars.get(i)'は何をしますか? –

+2

間違ったチェックを修正してください。しかし、主な考え方は 'chars.remove(i)が最後の文字だった場合、' chars.get(i) 'はoutOfBoundになります。 –

関連する問題