访问arrayList中另一个字符串之前和之后的字符串

时间:2013-01-24 08:55:22

标签: java for-loop arraylist indexoutofboundsexception

如果我在arrayList中搜索第5项,我也想获得第4和第6项。这个代码在最后的if语句中提供,定义为(i - 1)和(i + 1)。到目前为止,这是我的代码:

import java.util.ArrayList;

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

    ArrayList<String> planets = new ArrayList<String>();
    String names[] = { "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranis", "Neptune", "Pluto"};

    for (int i = 0, n = names.length; i < n; i++) {
        planets.add(names[i]);
        String value = (String) planets.get(i);

        if(value.contains("Mars")) {
            String newNum = value.replace(value, "Red planet ");
            planets.set(i,newNum);     
        }
        if(value.contains("Uranis")) {
            String wordBefore = (String) planets.get(i-1);
            String wordAfter = (String) planets.get(i+1);
            String newNum = value.replace(value, "Uranus ");
            planets.set(i,newNum);
            System.out.println("This is the word before " + wordBefore);
            System.out.println("This is the word after " + wordAfter);
            planets.remove(i-1);  
        }
    }
    System.out.println(planets);
}
}

有了这个,我得到一个indexoutofbounds异常,这显然是由最后的if语句中的wordAfter行引起的,并且因为for循环没有遍历整个arrayList。最后的if语句不需要与其他if语句在同一个for循环中,但如果它在不同的循环中,则replace方法必须能够将替换的单词放回正确的位置。

此致

6 个答案:

答案 0 :(得分:2)

完成将字符串添加到列表中,然后再次尝试迭代列表以获取逻辑。当get(i+1)是添加到列表中的最大值时,您正在尝试i

答案 1 :(得分:2)

此行导致问题。

 String wordAfter = (String) planets.get(i+1);

因为最大索引是i。

如果按以下方式进行检查会更好。

public static void main(String args[]) {

    ArrayList planets = new ArrayList();
    String names[] = { "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranis", "Neptune", "Pluto"};

    for (int i = 0, n = names.length; i < n; i++) {
        planets.add(names[i]);

    }
    for (int i = 0, n = names.length; i < n; i++) {

        String value = (String) planets.get(i);

        if(value.contains("Mars")) {
            String newNum = value.replace(value, "Red planet ");
            planets.set(i,newNum);     
        }
        if(value.contains("Uranis")) {
            String wordBefore = (String) planets.get(i-1);
            String wordAfter = (String) planets.get(i+1);
            String newNum = value.replace(value, "Uranus ");
            planets.set(i,newNum);
            System.out.println("This is the word before " + wordBefore);
            System.out.println("This is the word after " + wordAfter);   
        }
    }
    System.out.println(planets);
}

答案 2 :(得分:1)

planets.add(names [i]); ...在这一行中只有你向arraylist添加一个值。此时,你的arraylist的大小是i。没有增加i或者向arraylist添加任何值,你试图在i + 1处访问元素。所以它肯定会抛出IOB异常

答案 3 :(得分:1)

我认为这将解决您的问题

您的代码正在提供异常

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 7
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at PlanetsList.main(PlanetsList.java:20)

以下是一个工作:

import java.util.ArrayList;

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

ArrayList planets = new ArrayList();
String names[] = { "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranis", "Neptune", "Pluto"};

for (int i = 0, n = names.length; i < n; i++) {
planets.add(names[i]);
}
for (int i = 0, n = names.length; i < n; i++) {
String value = (String) planets.get(i);

if(value.contains("Mars")) {
String newNum = value.replace(value, "Red planet");
planets.set(i,newNum);     
}
 if(value.contains("Uranis")) {
String wordBefore = (String) planets.get(i-1);
String wordAfter = (String) planets.get(i+1);
String newNum = value.replace(value, "Uranus");
planets.set(i,newNum);
System.out.println("This is the word before " + wordBefore);
System.out.println("This is the word after " + wordAfter);   
 }
}
System.out.println(planets);
}
}

我在您的代码中进行了两处更改:

  1. 采取两个for循环
  2. 从以下两行中删除spaces

    String newNum = value.replace(value, "Red planet ");
    String newNum = value.replace(value, "Uranus ");
    

答案 4 :(得分:1)

您可以使用Arrays.asList将数组转换为List,然后遍历列表进行处理。无论如何,你应该检查wordBefore和wordAfter的索引是否在List限制范围内。

答案 5 :(得分:1)

我也觉得问题不是不言自明的......但如果你需要在arraylist中的特定项目之前和之后获取元素,你可以这样做。

我的假设是您已经预先填充了值的列表。

String names[] = { "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranis", "Neptune", "Pluto"};

List<String> planets = java.util.ArrayList.asList(names);

if (planets.contains("Uranis") ) {
   int currentIndex = planets.indexOf("Uranis");       
   String previousItem = planets.get(currentIndex-1);
   // To ensure that we have an element next to the current one. 
   if (currentIndex < (planets.size() - 1 )) {
    String nextItem = planets.get(currentIndex+1); 
   }
}

我希望这会对你有所帮助

〜Ragesh