Java 基于行启动器的文本文件拆分

Java 基于行启动器的文本文件拆分,java,string,Java,String,我想根据行开始符将行拆分为列表,但在尝试时遇到异常 文件内容: H1|!!!!!!!!!!!!!!!!! L1|DDDDDDDDDDDDD L2|DDDDDDDDDDDDD H2|!!!!!!!!!!!!!!!!! L1|DDDDDDDDDDDDD L2|DDDDDDDDDDDDD L3|DDDDDDDDDDDDD EOF Postring size :8 SSSSS:H1|!!!!!!!!!!!!!!!!! 0head:H1|!!!!!!!!!!!!!!!!! 1detail:L1|D

我想根据行开始符将行拆分为列表,但在尝试时遇到异常

文件内容:

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:::::::
输出:

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 | DDD,L2 | DDD,L3 | DDD,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);
                   }
               }
List listOrder=new ArrayList();
Set hs=新的HashSet();
if(poString!=null&&poString.size()>0)
{      
headerstart:
对于外环中的(int i=0;i:-

for(int i=0;i<poString.size();i++)
for(int j=i+1;i<poString.size();j++)
j
的值是用
poString.size()
初始化的。现在,由于您的条件是
i
,这对于
i=poString.size()-1
,您可以在循环内部移动,并在以下位置访问索引
j
:-

String t = poString.get(j);  
这是
IndexOutOfBounds
。事实上,您只会在外部循环的第一次迭代中遇到此问题。由于条件中的逻辑错误,您的内部循环从未中断

因此,基本上,您需要将内部循环更改为:-

for(int j=i+1; j < poString.size();j++)
for(int j=i+1;j
注意,在条件部分中,我只将
I
更改为
j

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

由于此迭代直接控制
j

谢谢。但为什么不在集合中添加H1的第一个列表?请帮助我。它给出如下输出……。[H2 |!!!!!!!!!!!!!!!!!!!!!L1 | ddddddddddd,L2 | ddddddddddd,L3 | ddddddddddd,EOF]]@sunleo..现在还不清楚你想做什么。如果你能在代码的基础上,对你的问题添加一些解释,那会更好,因为代码试图完成什么。谢谢你的帮助,我得到了答案。