2016-04-27 16 views
0

私は配列と配列リストの教育を続けていますが、あるメソッドから別のメソッドにArrayListを渡すことでコードをスマート化しようとしています。ここに私のコードです:メソッド間での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))); 
} 

表示方法では、両方のステートメントがコメントアウトされています。現在コメントされているfor文は、行が文字列を検索しているが、配列alが文字列であってもオブジェクトに割り当てられているため動作しません。アルを弦などにキャストする必要がありますか?これは、ループがArrayListを作成したのと同じメソッドにあるときにforループを実行したときに当てはまるものではなく、その違いを理解できません。

コメントアウトされていない文のための第二は、私に次のランタイムエラーを与えるクラッシュが発生します。

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

私は、ハードコード化された番号にi < al.size()を変更しようと、それはまだ失敗したと私はしないでください理由を知っている。

+2

生タイプより適切かもしれないために強化使って、何らかの理由でインデックスを必要としない限り?どうして? – bcsb1001

+0

あなたは「インデックスiの値が 'al.get(i)'」であることを意味すると思いますか? –

+0

右クリケット。ちょうどそれについて考えて結びついて結ばれた。 – Airfix

答えて

3

1)あなたはArrayList<String>としてそれを渡す必要があります:あなたは、リスト内の整数を探している

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

2)。リストには整数が含まれていないので、indexOfは-1を返します。次に、al.get(-1)と呼びます。ここで、-1は明らかに範囲外です。あなたがここでやろうとしていることが分かりません。

+0

それはまさに私が知る必要があったものです。それを文字列として渡します。私は頭の中に2つの異なるコードを混ぜていたので、インデックスに関する私の眩しいエラーを参照してください。私は休憩を取る時間と思います。助けてくれてありがとう。ゆっくりと、このことは意味をなさないようになっています。 Airfix。 – Airfix

1

を指定すると、が検索され、リストに含まれている場合はそのインデックスが返されます。これは当てはまりません。つまり、List<String>です。インデックス-1の要素を取得しようとしているため、インデックスが範囲外になります。要素が見つからない場合は、indexOf()から-1が返されます。

これは、生のタイプを使用しない理由です。あなたのパラメータ(それは、具体的ArrayListのようにする必要はありません)としてget()List<String>を使用します。

System.out.println("Value at Index " + i + 
    " is " + al.get(i)); 

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

「コードをsmarten」するための一つの他の事は、特定の実装を使用しないことです宣言またはパラメータで使用します。

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) { 
    .... 
} 

機能は同じですが、実装ではなくインターフェイスをプログラミングする方がプログラミングの面で優れています。

EDIT:また、あなたが本当にループが

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

最初のコメントArrayListがListの実装であることを理解していれば、実装を呼び出すことによって何らかの形で柔軟性が増していると基本的に言います(これは私の基本知識ではまだ分かりません)。強化されたループに関しては、私はFortran、C、およびビジュアルベーシックベーシックの知識から生まれたので、これは私の最初のプログラミングであり、私はまだロープを学んでいます。疑いがあれば私は私のルーツに落ちる。 – Airfix

+1

@Airfix、[Programming to interfaces](http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface)には、その答えが示すように多くの利点があります。 [別のものをここで取る](http://www.fatagnus.com/program-to-an-interface-not-an-implementation/)。一般的に、必要に応じて実装を変更する機能を保持する必要があります。今日は 'ArrayList'を持っていますが、明日は' LinkedList'がより適切でしょう。パラメータに 'List 'がある場合は、実装を調整することができ、他のコードは認識されません。 – KevinO

関連する問題