2015-01-03 54 views
2

我看不出什么毛病我的代码: -为什么我得到一个ArrayIndexOutOfBoundsException对于我的ArrayList

import java.util.ArrayList; 

public class Main { 

    public static void main(String[] args) { 

     int[] A = new int[] {2, 1, 1, 2, 3, 1}; 
     ArrayList<Integer> foundNumbers = new ArrayList<>(); 
     int distinct = 0; 

     for(int i = 0; i < A.length-1; i++) { 
      if(foundNumbers.get(i-1) == null) { 

       foundNumbers.set((i-1), A[i]); 
       distinct++; 
      } 


    } 
     System.out.println(distinct); 
}  
} 

我要检查,如果数组元素的值我已经被分配给ArrayList的元素i-1 ,然后递增不同的变量并打印数组中有多少个不同的值。

这里的异常,当我i的值改变为1: -

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
    at java.util.ArrayList.rangeCheck(ArrayList.java:604) 
    at java.util.ArrayList.get(ArrayList.java:382) 
    at tdd.Main.main(Main.java:19) 
+4

'I-1 = -1' i = 0时 –

+1

'指数:0,大小:0' - 这是什么告诉你吗? –

+0

@HotLicks ArrayLists自动扩展它们吗? –

回答

2

该列表是完全空的。你没有放入任何东西,但你试图用foundNumbers.get调用读取它的元素,所以任何索引都会超出范围。

A添加独特的元素到列表中,getset只是错误的列表上的方法调用,使用containsadd如果这是你想要做什么:

for (int x : A) { 
    if (!foundNumbers.contains(x)) 
     foundNumbers.add(x); 
} 

这里是同样的逻辑如上面写的更详细的方式,可能更容易理解什么是参与:

for (int i = 0; i < A.length; i++) { 
    boolean found = false; 
    for (int j = 0; j < foundNumbers.size(); j++) { 
     if (A[i] == foundNumbers.get(j)) { 
      found = true; 
      break; 
     } 
    } 
    if (!found) { 
     foundNumbers.add(A[i]); 
    } 
} 

你不需要单独distinct VA riable,因为它只是foundNumbers.size()


虽然这个工作,一个List不是消除重复,如果要素的数量很大,因为每个contains调用需要在列表中的内容,另一种循环非常有效的。一个Set自动防止重复和内部结构及其内容的方式,使得它有效地这样做:

Set<Integer> distinct = new TreeSet<>(); 
for (int x : A) distinct.add(x); 
System.out.println(distinct); // [1, 2, 3] 
+0

我不想用数组的内容填充它,只有在数组中出现不同的值,例如,在本例中,数组列表应该有1,2和3里面 –

+0

@ AngelaMarie-Daley编辑 – Boann

+0

当我更改代码到您的编辑,我得到IndexOutOfBoundsException:索引:1,大小:0 –

1
for(int i = 0; i < A.length-1; i++) { 
    if(foundNumbers.get(i-1) == null) { 

第一迭代该循环,i将被设置为零,所以第二行是做.get(-1)

+0

即使我把它设置为1,我仍然会得到一个异常 –

1

有多种问题:

  • 当我是0,你尝试获得I- 1 =无效的第1个元素
  • 即使您解决此问题,由于您没有列表中的元素,因此您仍然会得到IndexOutOfBoundsException,因为您尚未存储任何元素,并且您的列表为空。

你的循环应该是:

for (int i = 0; i < A.length - 1; i++) { 
     if (foundNumbers.size() > i && foundNumbers.get(i) == null) {//or better you use contains method of list like foundNumbers.contains(someNumber); 
      foundNumbers.add(A[i]); 
      distinct++; 
     } 
} 
相关问题