0

誰かが私を助けてくれることを願って、配列リストに最後の 5 つのオブジェクトを表示したいのですが、コードに何か問題があります :( 、助けが必要です

   for(int i=savedPreventivemachineList.size()-1 ; i < 5  ; i--)
   {
     Listresult.add(savedPreventivemachineList.indexOf(i), interventionmachine);
   }
   savedPreventivemachineTopList=Listresult;

実行すると、次のエラーが表示されます。

java.lang.IndexOutOfBoundsException: Index: -1, Size: 0
java.util.ArrayList.rangeCheckForAdd(Unknown Source)
java.util.ArrayList.add(Unknown Source)
4

8 に答える 8

3

リストの最後の 5 つのオブジェクトをリストにリストするには、ループを 5 回実行する必要があります。

たとえば、リストのサイズが 34 の場合

最後のアクセス可能なインデックスは -> 34 - 1 = 33

したがって、最後の 5 つのインデックスは -> 33,32,31,30,29 です。

サイズ - 6 = 28 は、ループがサイズ -6 まで実行されることを意味します

これがコードです。

for(int i=savedPreventivemachineList.size()-1 ; i > savedPreventivemachineList.size()-6  ; i--)
   {
     Listresult.add(savedPreventivemachineList.indexOf(i), interventionmachine);
   }
   savedPreventivemachineTopList=Listresult;

さらに、ループ インデックスが決して負の値にならないことを確認する必要があります。

これを行うには、条件を追加してループ条件を変更しますi >-1

for(int i=savedPreventivemachineList.size()-1 ; i > savedPreventivemachineList.size()-6 && i >-1 ; i--)
于 2013-07-24T13:15:03.383 に答える
3

条件を逆にします。

for(int i=savedPreventivemachineList.size()-1 ; i > -1  ; i--)

i>-1またはとして条件を設定しますi>=0List listサイズの を覚えておいてください: は からにlist.size()インデックス付けされます。カウンタがsize()-1,size()-2, .... ,2,1,0から徐々に減少するため、逆の順序になります。0list.size()-1list.size()-10i

この目的のためにListIteratorを使用することもできます。そのほうが安全です。

プログラマーがリストをどちらの方向にもトラバースし、反復中にリストを変更し、リスト内の反復子の現在の位置を取得できるようにするリストの反復子。ListIterator には現在の要素がありません。そのカーソル位置は常に、previous() の呼び出しによって返される要素と next() の呼び出しによって返される要素の間にあります。

ヒントを得るために、Java でリストを逆順に読むことができます。

配列リストに最後の 5 つのオブジェクトを表示したい

次に、条件は です((i>savedPreventivemachineList.size()-6) && (i > -1))。したがって、最後の5要素が必要なためsavedPreventivemachineList.size()-6、インデックスが下回らないことを考慮する必要が0ありi>-1ます。

于 2013-07-24T13:11:29.617 に答える
3

カウンターiが 0 より小さくなります。

条件として使用(i > savedPreventivemachineList.size() - 5) && (i >= 0)します。

于 2013-07-24T13:11:56.140 に答える
2

現在のコードは、次の 2 つのシナリオにつながる可能性があります。

  1. 配列サイズが 5 より大きい場合、条件 "i < 5" は最初の繰り返しで失敗し (i が 5 以上になるため)、ループは何もしません。
  2. 配列サイズが 5 以下の場合、「i < 5」が false になることはなく、ループは無限に続きます。i が 0 未満になると、配列の範囲外になるため、これは失敗します。

これを解決するには: for(int i =savedPreventivemachineList.size()-1 ; i >= 0 && i >= savedPreventivemachineList.size()-5 ; i--)

カウントバックし、i が -1 (インデックスエラーを防ぐためのフェイルセーフ) になるか、または i が配列のサイズ - 5 より小さくなるとすぐに、ループから抜け出します。 (5 番目の項目に到達)

于 2013-07-24T13:23:49.730 に答える
1
Collections.reverse(savedPreventivemachineList);

次に、foreachループを使用します。

于 2013-07-24T13:11:39.263 に答える
0

あなたが使用することができますListIterator

final ListIterator<String> thingIter = things.listIterator(things.size());
for (int i = 0; i < 5 && thingIter.hasPrevious(); ++i) {
    final String thing = thingIter.previous();
}

減少ループがないので、これは少し明確だと思います。

于 2013-07-24T13:15:04.337 に答える
0

java.lang.IndexOutOfBoundsException: インデックス: -1、サイズ: 0 は IndexOutOfBoundsException を示します

単純int i=savedPreventivemachineList.size()-1に -1savedPreventivemachineList.size()です。Zero

前方反復

for(Iterator<String> iter = savedPreventivemachineList.iterator(); iter.hasNext(); ) {
  String item = iter.next();
  //item do what u want
}

後方反復

for(int i=savedPreventivemachineList.size()-1 ; i >= 0  ; i--)

リストの場合

List<String> orderList = *****
List<String> reverseList = Lists.reverse(orderList);
于 2013-07-24T13:16:01.050 に答える
0

@erencan、ありがとう、間違いに気づきました。:)

int size = list.size()-1;
for(int i=size; i>=(size-5); i--){

これが間違っていないことを願っています。:)

于 2013-07-24T14:00:01.483 に答える