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|DDDDDDDDDDDDD,L2|DDDDDDDDDDDDD,L3|DDDDDDDDDDDDD,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++)

请注意,我只在条件部分更改ij

于 2013-02-04T13:29:39.937 回答
1

这里

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

在执行此操作时,您将在包含您的逻辑的 for 的上下文之外存储手动递增j的值。i这可以看作是“未经检查”的增量,i因为您使用j定义您使用索引迭代的同一集合的i索引。

每当您这样做时,在最后一个元素上,您将使用超出数组边界的索引 for j,因为如果最后一个索引是7(请记住,列表像数组一样从索引0到索引),将是8、会扔。length - 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 回答