基于Line Starter拆分文本文件

时间:2013-02-04 13:27:34

标签: java string

我希望基于行启动器将拆分行放入列表中,在尝试时会出现异常。

文件内容:

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 | DDDDDDDDDDDD,L2 | DDDDDDDDDDDD,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);
                   }
               }

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

下面

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

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

任何时候你这样做,在最后一个元素上你将使用超出j数组范围的索引,因为如果最后一个索引是7(请记住,列表从索引0转到索引length - 1,就像数组一样),j将为8,poString.get(j)将抛出IndexOutOfBoundsException

每当您手动递增索引值时,您应该始终进行范围检查(如果j介于0poString.size() - 1之间,两者都包括在检查中),或者在某个时间构造一个给定的不同变量。循环将迭代,直到不再满足条件(即,当i< poString.size()返回false时),但您的条件与i相关,而不是j,从而允许这种不幸处理迭代中的索引以验证其他索引。由于未在for循环上进行检查,因此您必须手动执行此操作。

在你的情况下,这样的事情可能是解决方案:

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

由于此迭代直接控制j