2013-02-04 30 views
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 --is線的列表字符串

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); 
        } 
       } 

回答

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

+0

謝謝。但爲什麼H1的第一個列表中沒有添加集?請幫助我。它給出這樣的輸出........ [[H2 | !!!!!!!!!!!!!!!!! ,L1 | DDDDDDDDDDDDD,L2 | DDDDDDDDDDDDD,L3 | DDDDDDDDDDDDD,EOF]] – sunleo

+0

@sunleo ..你不清楚你想做什麼。除了代碼之外,如果你爲你的問題添加一些解釋,那麼這樣會更好,至於代碼試圖完成什麼。 –

+0

感謝您的幫助我從您那裏得到了答案.......... – sunleo

1

這裏

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

,而這樣做,你j要存儲,是由手工遞增的該上下文之外的i值圍住你的邏輯。這可以看作i的「未檢查」增量,因爲您使用j來定義與i索引一起重複使用的同一集合的索引。

每當你這樣做,最後一個元素你會使用這出結合的陣列j的一個指標,因爲如果最後指數是7(記住,列出了從指數0去指數length - 1就像陣列一樣),j將8和poString.get(j)將扔IndexOutOfBoundsException

你應該總是做了一系列檢查(如果j0poString.size() - 1之間,既包括在支票上)每當你手動遞增索引值,或者在一定的時間構建一個給定不同的變量。循環將迭代直到不再滿足條件(即i< poString.size()返回false時),但是您的條件與i而不是j相關,因此在處理迭代中的索引時可以對其他索引進行驗證。由於在for循環中未執行檢查,因此必須手動完成。

在你的情況,這樣的事情可能是解決:

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

由於本次迭代直接控制j

+0

感謝您的幫助我得到了答案。 – sunleo