2013-03-10 80 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

反转您的循环 - 从阵列的后面工作到前面。这样,当您删除条目时,您不会更改尚未阅读的条目的索引。

您的其他选择是通过调整您的循环索引来考虑删除,但这更棘手。

(还有一种选择是组成一个包含原始字符串和已排序字符串的对象,并对它们进行排序,并使用排序方案对排序字符串进行排序,然后扫描列表和注意,当你有一个“运行”相同的排序键不需要删除

创建该对象的“骗子”方式是将排序和原始字符串放在一个字符串中,用空格分隔或其他特殊字符,然后对字符串进行排序。)

相关问题