1

行スターターに基づいて行をリストに分割したいのですが、それを試みているときに例外が発生しています。

ファイルの内容:

H1|!!!!!!!!!!!!!!!!!
L1|DDDDDDDDDDDDD
L2|DDDDDDDDDDDDD
H2|!!!!!!!!!!!!!!!!!
L1|DDDDDDDDDDDDD
L2|DDDDDDDDDDDDD
L3|DDDDDDDDDDDDD
EOF

出力:

   Postring size :8
SSSSS:H1|!!!!!!!!!!!!!!!!!
0head:H1|!!!!!!!!!!!!!!!!!
1detail:L1|DDDDDDDDDDDDD
2detail:L2|DDDDDDDDDDDDD
3detail:H2|!!!!!!!!!!!!!!!!!
SSSSS:H2|!!!!!!!!!!!!!!!!!
3head:H2|!!!!!!!!!!!!!!!!!
4detail:L1|DDDDDDDDDDDDD
5detail:L2|DDDDDDDDDDDDD
6detail:L3|DDDDDDDDDDDDD
7detail:EOF
SSSSS:L1|DDDDDDDDDDDDD
SSSSS:L2|DDDDDDDDDDDDD
SSSSS:L3|DDDDDDDDDDDDD
SSSSS:EOF
hshshshshs:::::::

[[H2|!!!!!!!!!!!!!!!!!!!!, L1|DDDDDDDDDDDDDD, L2|DDDDDDDDDDDDDD, L3|DDDDDDDDDDDDDD, EOF]]

listOrder -- 行文字列のリストです

 List<Order> listOrder = new ArrayList<Order>();
           Set<List<String>> hs = new HashSet<List<String>>();
           if(poString !=null && poString.size() > 0)
            {      

               headerstart:
               for(int i=0;i<poString.size();i++)
               {
                   String s = poString.get(i);
                   if(s.startsWith("H"))
                   {
                       List<String> tempS = new ArrayList<String>();
                       tempS.add(s);
                       System.out.println("head:"+s);
                       for(int j=i+1;i<poString.size();j++)
                       {
                           String t = poString.get(j);
                           System.out.println("detail:"+t);
                           if(t.startsWith("H"))
                           {
                               i = j-1;
                                               hs.add(tempS);
                               continue  headerstart;
                            }
                           else
                           {
                            tempS.add(t);
                           }
                       }
                       hs.add(tempS);
                   }
               }
4

2 に答える 2

1

あなたの外側のループで: -

for(int i=0;i<poString.size();i++)

の値が にi達するpoString.size() - 1と、内側のループで: -

for(int j=i+1;i<poString.size();j++)

の値はjで初期化されpoString.size()ます。あなたの条件はi < poString.size()に対してまだ真であるためi = poString.size() - 1、ループ内に移動し、次のインデックスにアクセスしますj

String t = poString.get(j);  

ですIndexOutOfBounds。実際、この問題は外側のループの最初の繰り返しでのみ発生します。条件の論理エラーのために、内側のループが壊れることはありません。

したがって、基本的に、内側のループを次のように変更する必要があります。

for(int j=i+1; j < poString.size();j++)

なお、状態部分のみ変更iしております。j

于 2013-02-04T13:29:39.937 に答える
1

ここ

for(int j=i+1;i<poString.size();j++)

これを行っている間、ロジックを囲む for のコンテキストの外で、手動でインクリメントされjた値を格納しています。これは、インデックスを反復処理する同じコレクションのインデックスを定義するために使用するためi、「チェックされていない」増分と見なされる可能性があります。iji

これを行うときはいつでも、最後の要素で の配列の範囲外のインデックスを使用することになります。これはj、最後のインデックスが(配列のようにリストがインデックスから7インデックスに移動することを思い出してください) 場合、 8を投げます。0length - 1jpoString.get(j)IndexOutOfBoundsException

インデックスの値を手動でインクリメントするとき、または特定の時間に特定の異なる変数を構築するときはいつでも、常に範囲チェックを行う必要があります (jが と の間0にある場合、両方ともチェックに含まれます)。poString.size() - 1ループは、条件が満たされなくなるまで (つまり、i< poString.size()false が返されるまで) 繰り返されますが、条件はiではなく に関連しているため、j他のインデックスに対して検証する反復でインデックスを処理するときに、この不運を許してしまいます。forループ上ではチェックを行っていないため、手動で行う必要があります。

あなたの場合、次のようなものが解決策になる可能性があります。

int j = 0;
for(j = i + 1;j < poString.size();j++)

この反復はj直接制御するためです。

于 2013-02-04T13:36:46.267 に答える