[英]Removing items from list by index while looping through 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
如果你知道j
总是大于i
(因为for循环),如果你首先删除索引为i
的元素,那么你可以删除索引为j - 1
的元素得到预期的结果。
cards.remove(i);
cards.remove(j-1);
使用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;
}
cards.remove(i);
cards.remove(j);
一旦从LinkedList
删除元素,它就会将任何后续元素向左移动(从索引中减去一个元素)。 如果j > i
您可以使用j-1
而不是j
。 或者, cards.remove(Card)
代替。
问题是当你从列表中删除一个对象时,你没有考虑到删除后大小不一样的事实,并且在删除后元素的索引被更改
假设您要删除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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.