0

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メソッドは置換された単語を正しい位置に戻すことができる必要があります。

よろしく

4

6 に答える 6

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);
}
于 2013-01-24T09:07:30.403 に答える
2

リストへの文字列の追加を完了してから、ロジックに対してリストを繰り返し処理してみてください。最大値がリストに追加されるのはget(i+1)いつですか。i

于 2013-01-24T08:59:58.913 に答える
1

planets.add(names [i]); ...この行では、arraylistに値を追加しているだけです。この時点で、arraylistのサイズはiです。iをインクリメントしたり、arraylistに値を追加したりせずに、試行しています。 i + 1で要素にアクセスするには..したがって、間違いなくIOB例外がスローされます

于 2013-01-24T09:01:38.467 に答える
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);
}
}

コードに2つの変更を加えました。

  1. forループを2つ取得
  2. spaces次の2行から削除します

    String newNum = value.replace(value, "Red planet ");
    String newNum = value.replace(value, "Uranus ");
    
于 2013-01-24T09:04:55.330 に答える
1

Arrays.asListを使用して配列をリストに変換し、リストを反復処理して処理を行うことができます。とにかく、wordBeforeとwordAfterのインデックスがリストの制限内にあることを確認する必要があります。

于 2013-01-24T09:12:03.300 に答える
1

また、質問は自明ではないと感じています...しかし、配列リスト内の特定の項目の直前と直後の要素を取得する必要がある場合は、このようにすることができます。

私の仮定は、値が事前に入力されたリストがすでにあることです。

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

于 2013-01-24T09:16:15.960 に答える