2013-03-10 81 views
0

所以我有一個ArrayList稱爲originalList,看起來像下面這樣:有人可以幫我糾正這個java循環。它是如此接近是正確的

[鍋,小睡,盆,坐,它,TIS,卡]

我也有一個稱爲ArrayListmodifiedList它看起來像

[ANPs的,航行計劃,OPST,IST,IST,IST,航行計劃]

修改列表取原始列表,刪除標點符號並對其進行排序。這個程序的目的是輸入一個輸入(originalList)並查看輸入中是否有字符。字謎是由相同字母組成的單詞。我的循環打印出anagrams時出現問題。這裏的循環:

for (int i=0; i<modifiedList.size();i++){ 
     System.out.print(originalList.get(i)); 
     for (int j=i+1;j<modifiedList.size();j++){ 
      if (modifiedList.get(i).contentEquals(modifiedList.get(j))){ 
       System.out.print(" "+ originalList.get(j)); 
       originalList.remove(j); 
       modifiedList.remove(j);      
      } 

     }System.out.println(); 

    } 

當我運行的循環,我得到以下幾點:

pans naps snap 
pots 
sit it's 
tis 

一切都是正確的,除了TIS未被列爲坐的字謎,它的。這是使用modifiedList.remove(j)的原因,它導致第二個循環在它到達tis之前退出,並且tis從不打印座標和它。 modifiedList.remove(j)是必要的,以便在輸出中不重複單詞。我該如何解決這個問題,以便將它列爲靜坐的字謎,它是?

回答

1

問題是你正在改變數組的索引,但不改變j。當你移除時,你將每個後面的項目的索引減1。所以,當你打它時,它匹配。你刪除它,移動到它曾經擁有的索引。然後,給j添加1,現在運行在數組的末尾(因爲snap已經被刪除)。因此,在刪除j之後,您需要將j減1。

+0

不錯,這是最簡單的修復 – user2012751 2013-03-10 02:28:27

0

反轉您的循環 - 從陣列的後面工作到前面。這樣,當您刪除條目時,您不會更改尚未閱讀的條目的索引。

您的其他選擇是通過調整您的循環索引來考慮刪除,但這更棘手。

(還有一種選擇是組成一個包含原始字符串和已排序字符串的對象,並對它們進行排序,並使用排序方案對排序字符串進行排序,然後掃描列表和注意,當你有一個「運行」相同的排序鍵不需要刪除

創建該對象的「騙子」方式是將排序和原始字符串放在一個字符串中,用空格分隔或其他特殊字符,然後對字符串進行排序。)

相關問題