在我对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()
更改为硬编码号码但仍然失败,我不知道原因。
答案 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
}