在方法之间传递ArrayList

时间:2016-04-27 22:02:43

标签: java arraylist

在我对Arrays和ArrayLists的继续教育中,我试图通过将ArrayList从一个方法传递到另一个方法来使我的代码变得聪明。这是我的代码:

public void exampleArrayList () {
    ArrayList<String> al = new ArrayList<String>();
    al.add("AZ");
    al.add("BY");
    al.add("CX");
    al.add("DW");
    al.add("EV");
    al.add("FU");
    al.add("GT");

    display(al);
}

public void display(ArrayList al) {

    System.out.println("Index of 'AZ': " + al.indexOf("AZ"));
    System.out.println("Index of 'FU': " + al.indexOf("FU"));
    System.out.println("Index of 'AA': " + al.indexOf("AA"));
    System.out.println("Index of 'CX': " + al.indexOf("CX"));

    // for (String row : al)
    //   System.out.println("Value at Index " + al.indexOf(row) +
    //      " is " + al.get(al.indexOf(row)));

    for(int i = 0; i < al.size(); i++)
        System.out.println("Value at Index " + al.indexOf(i) +
            " is " + al.get(al.indexOf(i)));
}

在display方法中,两个for语句都被注释掉了。当前注释掉的for语句不起作用,因为row正在寻找一个String,但是即使array al是一个字符串,也会被赋予一个对象。我是否需要将其投入字符串或其他内容?当循环使用与创建ArrayList相同的方法运行for循环时,情况并非如此,我并不了解其中的区别。

没有注释掉的第二个for语句会导致崩溃,从而导致以下运行时错误:

java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1

我尝试将i < al.size()更改为硬编码号码但仍然失败,我不知道原因。

3 个答案:

答案 0 :(得分:3)

1)您需要将其作为ArrayList<String>传递:

public void display(ArrayList<String> al) {
                             ^^^^^^^^

2)您正在搜索列表中的整数。该列表不包含任何整数,因此indexOf返回-1。然后你调用al.get(-1),其中-1显然超出范围。我不确定你在这里做什么。

答案 1 :(得分:1)

您正在使用indexOf(),如果列表中包含int,则会int搜索该List<String>并返回其索引。因为情况并非如此 - 它是indexOf() - 你得到的索引超出界限,因为你试图在索引-1处检索一个元素。如果找不到该元素,则从List<String>返回-1,但它不能。

这就是你不应该使用原始类型的原因。使用get()ArrayList作为参数(无需专门制作System.out.println("Value at Index " + i + " is " + al.get(i)); ):

public void display(ArrayList<String> al) {

Bytes

答案 2 :(得分:1)

“智能化代码”的另一个方面是不在声明或参数中使用特定的实现。

public void exampleArrayList () {
   // use the interface List<T>, not the specific implementation ArrayList<T>
   List<String> al = new ArrayList<String>();

   ...
}

// take the Interface, and give it the type
public void display(List<String> al) {
  ....
}

功能将是相同的,但它是一种更好的编程方法来编程接口而不是实现。

编辑:另外,除非您出于某种原因确实需要索引,否则使用增强for循环可能更合适

for (String s : al) {
  //some operation
}