IndexOutOfBoundsException while循环执行-Java

时间:2016-11-19 05:29:28

标签: java

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中。

迭代数组并检查条件是否相等然后我在ArrayList中删除了它。但删除它时显示索引超出范围。

此代码适用于较小的数组大小,但在提供大量数组大小时显示异常。 当我给出数组大小为13个单词的字符串时,我遇到了问题。

这是我的完整代码。

3 个答案:

答案 0 :(得分: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);
        }
    }
}

答案 1 :(得分:0)

例外是因为您使用的是arr.length而不是al.size()。对于每次删除,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);

}
}

答案 2 :(得分:0)

问题是你的第二个循环。是从i + 1开始。但我是从0到长度-1。所以Last ein将是j = length-1 + 1,超出了数组长度。

所以将第一个for循环更改为:

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