2017-08-08 56 views
0

我有一长串Card对象。如果用户错过了一个问题,我想让同一类别的卡片移动到下一个插槽。将列表排序的方式使所有类别错开,这样每个下一个问题都会有所不同。ArrayList.add(int index,element)似乎没有移动元素

我有一个排序方法,应该在列表中的当前位置和下一个元素所需的类别中,并将该类型的元素的下一个出现移动到当前位置之后。

我没有看到这个算法的任何错误,所以我认为它可能是我使用ArrayList方法错误。但是,在查看文档后,看起来他们应该按预期工作。

我在测试列表后,它被认为是排序并没有任何移动,但列表确实包含我正在寻找的类别。

public static void sortCategoryToNext(ArrayList<Card> cardlist,String cat,int currentIndex){ 
      boolean sorted = false; 
      int i = currentIndex; 
      int insertionpoint = i; 
      do { 
       i++; 
       Card nextCard = cardlist.get(i); 
       if(nextCard.getCategory().equals(cat)){ 
        sorted = true; 
        cardlist.add(insertionpoint,nextCard); 
        cardlist.remove(nextCard); 
       } 

      }while(!sorted); 
     } 
+1

你只需要反转'add'和'remove'功能。在这里,您将删除您之前添加的卡片,因为“删除”删除了第一次出现。 – jeanr

回答

2

ArrayList.remove(Object)删除第一发生的对象,它处于使您刚刚插入的对象列表中的位置的。

取而代之的是:

   cardlist.add(insertionpoint,nextCard); 
       cardlist.remove(nextCard); 

试试这个:

   cardlist.remove(i); 
       cardlist.add(insertionpoint,nextCard); 

作为改进,在上面的代码还使用ArrayList.remove(int),这应该是更有效,因为它不必遍历该列表查找匹配的项目。