我必须创建一个具有 ArrayList 的方法;我需要从这个 ArrayList 中删除偶数。我已经为此编写了代码,但存在一个我无法识别的逻辑错误。
这是我的代码:
static void sortList(){
List <Integer> number=new ArrayList <Integer>();
number.add(11);
number.add(45);
number.add(12);
number.add(32);
number.add(36);
System.out.println("Unsorted List: "+number);
for (int i=0;i<number.size();i++){
int even=number.get(i)%2;
if (even==0){
System.out.println("This is Even Number:"+ number.get(i));
number.remove(i);
}
}
Collections.sort(number);
System.out.println("Sorted List: "+number);
}
代码的输出是:
Unsorted List: [11, 45, 12, 32, 36]
This is Even Number:12
This is Even Number:36
Sorted List: [11, 32, 45]
我想知道为什么 32 没有被捕获为偶数,因为它是偶数,然后我通过在同一位置使用不同的偶数进行测试,但结果是相同的。为什么在索引(3)处会发生任何偶数都无法捕获的情况。我真的很想知道为什么。所以请任何人都可以帮助我解决这个问题,还有其他更好的方法来实现这个解决方案吗?
谢谢
当您从列表中删除某些内容时,之后所有内容的索引都会发生变化!
具体来说,在您的实现中,32 不会被删除,因为它直接位于另一个偶数之后。
我会使用迭代器遍历列表,并使用该迭代器上的删除操作,如下所示:
for(Iterator i = number.iterator(); i.hasNext(); ) {
if (isEven(i.next()) {
i.remove();
}
}
Iterator
。它有一个您需要的 remove()
方法。
List<Integer> numbers = new ArrayList<Integer>();
numbers.add(11);
numbers.add(45);
numbers.add(12);
numbers.add(32);
numbers.add(36);
System.out.println("Unsorted List: " + numbers);
for (Iterator<Integer> iterator = numbers.iterator(); iterator.hasNext();) {
Integer number = iterator.next();
if (number % 2 == 0) {
System.out.println("This is Even Number: " + number);
iterator.remove();
}
}
Collections.sort(numbers);
System.out.println("Sorted List: " + numbers);
关于列表索引更改的两个答案都是正确的。 但是,还要注意,从 ArrayList 中删除项目的速度很慢,因为它必须实际上将以下所有条目向下排列。 相反,我建议创建一个仅包含偶数的新列表,然后丢弃旧列表。 如果您想在另一个答案中使用基于迭代器的删除代码,那么它对于小结果来说可以很好地工作,如果您使用 LinkedList,则对于较大的数据集来说,它可以很好地工作。 (我相信这就是名字;无可否认,我的 Java 有点生疏了。)
如果您在循环遍历列表时从列表中删除一个条目,则必须调整循环索引。不要忘记,删除元素会使列表的长度减少一,并有效地“洗牌”其后所有元素的索引。
问题(正如其他人提到的)是您在遍历列表时修改列表。 尝试添加“i--;” “if (even==0)”块内的行。 像这样:
for (int i=0;i<number.size();i++){
int even=number.get(i)%2;
if (even==0){
System.out.println("This is Even Number:"+ number.get(i));
number.remove(i);
// Add this:
i--;
}
}
这是过滤奇数元素的另一种巧妙方法。 无需手动循环访问集合,而是将工作卸载到 Apache Commons Collections
// apply a filter to the collection
CollectionUtils.filter(numbers, new Predicate() {
public boolean evaluate(Object o) {
if ((((Integer) o) % 2) == 0) {
return false; // even items don't match the filter
}
return true; // odd items match the filter
}
});
这是否真的更容易阅读和理解还有待商榷,但它更有趣。 如果某种 Predicate 经常使用,可以将其重构为静态常量并在各处重用。 这可以将它的使用变得更加干净:
CollectionUtils.filter(numberList, ODD_PREDICATE);
我做什么(Intelliji 与 kotlin)
fun main(args: Array<String>) {
var numbers = arrayList(1,2,3,4,5,6)
println(numbers.filter{it %2 == 0})
}
结果=2,4,6
public class RemoveEvenUsingAL {
public static void main(String[] args) {
List<Integer> list= new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
Iterator<Integer> it = list.iterator();
while(it.hasNext()){
Integer number= it.next();
if(number % 2 ==0){
it.remove();
}
}
System.out.println("ArryList Odd Number="+list);
}
}
我们可以使用ArrayList类中的默认方法removeIf。
List <Integer> number=new ArrayList <Integer>();
number.add(11);
number.add(45);
number.add(12);
number.add(32);
number.add(36);
number.removeIf(num -> num%2==0);
System.out.println(number);
也可以在循环结束前添加 i-- 。当我们从列表中删除一个项目时,下一个元素将占据已删除项目的位置。因此循环不会循环该元素。通过减小 i 的值,循环返回并检查之前跳过的项目。
for (int i=0;i<number.size();i++){
int even=number.get(i)%2;
if (even==0){
System.out.println("This is Even Number:"+ number.get(i));
number.remove(i);
i--;
}
}
d=[]
对于(g=1;g
{
d.push(ParseInt(prompt("告诉我要添加什么")))
}
对于(g=1;g
{
如果(d[g]%2==0)
{
d.拼接(g,g)
}
console.log("排除偶数的列表为",d)
}