循环遍历列表时,按索引从列表中删除项目

时间:2013-11-21 06:09:10

标签: java list

public boolean isTwoPair() {
    boolean isTwoPair = false;
    Collections.sort(deck);
    List<Card> cards = new LinkedList<Card>(deck);
    System.out.println(cards);  
    for (int i = 0; i < cards.size()-1; i++) {
        for (int j = i + 1; j < cards.size()-1; j++) {
            if (deck.get(i).equals(deck.get(j))) {
                cards.remove(i);
                cards.remove(j);
                System.out.println(cards);
            }
        }

    }
    return isTwoPair;

}

我认为我的问题出在我的cards.remove()上。当我删除卡时,下次卡被删除时,它会从更改的列表中删除它。有没有办法从列表中删除两个具有相同索引号的项目?

如果我必须删除索引0,1,因为它们都是这样的对:

[Ace,Ace,Three,Four,Four]

代码将其删除(删除索引0)

[Ace,Three,Four,Four]

而不是从第一个列表中删除索引1(Ace),而是将其从第二个列表中删除,所以

[Ace,Four,Four]

它从第二个列表中删除了索引1,这是三个。

这就是我所期待的

[Three,Four,Four]

此时我希望我的循环拾取并删除四和四

编辑:

    public boolean isTwoPair() {
    boolean isTwoPair = false;
    Collections.sort(deck);
    List<Card> cards = new LinkedList<Card>(deck);
    System.out.println(cards);  
    for (int cardOne = 0; cardOne < cards.size(); cardOne++) {
        for (int cardTwo = cardOne + 1; cardTwo < cards.size(); cardTwo++) {
            if (deck.get(cardOne).equals(deck.get(cardTwo))) {
                cards.remove(cardOne);
                cards.remove(cardTwo-1);
                System.out.println(cards);
                for(int cardThree = 0; cardThree < cards.size(); cardThree++){
                    for(int cardFour = cardThree+1; cardFour < cards.size(); cardFour++){
                        if(cards.get(cardThree).equals(cards.get(cardFour))){
                            cards.remove(cardThree);
                            cards.remove(cardFour-1);
                            System.out.println(cards);
                            isTwoPair = true;
                        }
                    }
                }
            }
        }

    }
    return isTwoPair;

}

这就是我现在正在使用的内容,如果我没有这样做,我真的不想创建一个新变量,所以我决定不删除Object

4 个答案:

答案 0 :(得分:3)

如果您知道j总是大于i(因为for循环),如果先删除索引为i的元素,则可以删除索引为j - 1的元素{1}}获得预期结果。

cards.remove(i);
cards.remove(j-1);

答案 1 :(得分:2)

使用List.remove(Object)代替List.remove(int)。这不再取决于List的顺序了。

public boolean isTwoPair() {
    boolean isTwoPair = false;
    Collections.sort(deck);
    List<Card> cards = new LinkedList<Card>(deck);
    for (int i = 0; i < cards.size()-1; i++) {
        for (int j = i + 1; j < cards.size()-1; j++) {
            cardI = deck.get(i);
            cardJ = deck.get(j);
            if (cardI.equals(cardJ)) {
                cards.remove(cardI);
                cards.remove(cardJ);
                isTwoPair = true;
            }
        }

    }
    return isTwoPair;

}

答案 2 :(得分:1)

cards.remove(i);
cards.remove(j);

只要从LinkedList中删除元素,它就会将任何后续元素向左移动(从索引中减去一个元素)。如果j-1,您可以使用j代替j > i。或者,cards.remove(Card)代替。

答案 3 :(得分:1)

问题是当你从列表中删除一个对象时,你没有考虑到删除后大小不一样的事实,并且删除后元素的索引会改变

假设您要删除0和1处的元素

initially => [Ace,Ace,Three,Four,Four]
               0   1    2     3    4

删除[0]

after removing [0] => [Ace,Three,Four,Four]
                        0    1     2    3

删除[1]

after removing [1] => [Ace,Four,Four]
                        0   1     2   

因此,您无法删除索引,而是使用List.remove(Object)