2016-11-19 17 views
0
package com.cp.javapractice; 

import java.util.ArrayList; 
import java.util.Scanner; 

public class Cp { 
public static void main(String args[]) { 
    ArrayList al = new ArrayList(); 
    Scanner s = new Scanner(System.in); 
    String str = null; 
    str = new String(); 
    System.out.println("Enter the string which you want to remove the  duplicates"); 
    str = s.nextLine(); 
    String arr[] = str.split(" "); 
    for (int k = 0; k < arr.length; k++) { 
     al.add(arr[k]); 
    } 
    try { 
     for (int i = 0; i < arr.length; i++) { 

      for (int j = i + 1; j < arr.length; j++) { 

       if (arr[i].equalsIgnoreCase(arr[j])) { 
        al.remove(j); 
       } 
      } 
     } 
     System.out.println(al); 
     } 
    catch (Exception e) { 
     System.out.println(e); 
    } 
} 
} 

私は特に指定された文字列をユーザーから置き換えようとしています。だから、splitメソッドを使って与えられた文字列をスペースで分割し、配列とarraylistに入れます。whileループ実行中のIndexOutOfBoundsException - Java

配列を繰り返して条件が同じであることを確認した後、ArrayListでそれを削除しました。しかし、それを削除すると、インデックスの境界外の例外が表示されます。

このコードは小さな配列サイズで動作しますが、多数の配列サイズを指定すると例外を示します。 配列サイズが13ワードの文字列を与えている間に問題が発生しています。

ここに私のフルコードです。

+4

! – jdigital

+0

重要な情報を省略しました。例外スタックトレース(完全)とコード内のどのステートメントが例外をスローするかの指示。不足している情報を含めるためにあなたの質問を編集してください –

+0

[IndexOutOfBoundsException]の重複している可能性があります(http://stackoverflow.com/questions/4269153/indexoutofboundsexception) – mx0

答えて

0
for (int i = 0; i < al.size(); i++) { 

    for (int j = i + 1; j < al.size(); j++) { 

     if (al.get(i).equals(al.get(j)) { 
      al.remove(j); 
     } 
    } 
} 
+0

なぜtoLowerCase Conversionコードを削除しましたか? @VojtechRuzicka – PassionInfinite

+0

申し訳ありませんが、私の悪い、それは単調だった、ちょうどインデントを修正したい。 –

+0

私は自分の編集をチェックし、実際にインデントにしか影響しません。 –

0

例外は、al.size()の代わりにarr.lengthを使用していることが原因です。すべての取り外しのために、arraylistのサイズは小さくなりますal。したがって、配列のサイズの代わりにarraylistのサイズを使用することを検討する必要があります。

for (int i = 0; i < al.size(); i++) { // change arr.length to al.size() 

      for (int j = i + 1; j < al.size(); j++) { // change arr.length to al.size() 

       if (arr[i].equalsIgnoreCase(arr[j])) { 
        al.remove(j); 

       } 
      } 
     } 

私は重複を除去するあなたの努力を減らしHashSetTreeSetをチェックアウトして、あなたをお勧めします。


HashSetに実装:

import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Scanner; 
import java.util.Set; 


public class Cp { 
public static void main(String args[]) { 

    Scanner s = new Scanner(System.in); 
    String str = null; 
    str = new String(); 
    System.out.println("Enter the string which you want to remove the  duplicates"); 
    str = s.nextLine(); 
    String arr[] = str.split(" "); 

    Set<String> ts = new HashSet<String>(Arrays.asList(arr)); // -> added only this line 

     System.out.println(ts); 

} 
} 
+0

はい!セットは、重複した値を処理するための労力を軽減します。良い提案。 @SkrewEverything – PassionInfinite

+0

それは働いています。ありがとうございました。 – Chitrapandi

+0

@Chitrapandiそして、答えを受け入れられたことを親切にマークし、質問を閉じます。 – SkrewEverything

0

問題は、あなたの第二のループです。スタートはi + 1です。しかし、私は0から長さ-1です。したがって、最後のeinはj = length-1 + 1となり、配列の長さを超えます。

そうにループのための第一の変更:これは、デバッガを使用する方法を学ぶのに最適な時間です

for(int i=0;i < arr.length-2;i++)