通过迭代器从ArrayList删除对象

问题描述 投票:0回答:4

我想创建一个类似于家庭预算的程序,所以我有一个课程AmountModel(我知道Integer不太适合id,但是现在不成问题了:)>

import java.time.LocalDate;

public class AmountModel {
  private Integer id;
  private Double amount;
  private CategoryModel categoryModel;
  private LocalDate localDate;

  // getters/setters etc.
}

并且在另一个类中,我构建了此deleteAmount方法:

static Scanner sc = new Scanner(System.in);

public List<amountModel> deleteAmount() {
    Iterator<AmountModel> it = amountList.iterator();
    while (it.hasNext()) { 
        System.out.println("Choose index to delete ");
        AmountModel am = it.next();
        if (am.getId().equals(sc.nextInt())) {
            it.remove();
        }
        break;
    }
    return amountList;
}

添加对象效果很好,但是当我尝试使用delete方法时,我必须放置第一个索引。

示例:我有三个对象(索引分别为0、1、2)。

  • 当我选择1或2程序时,什么也不做。
  • 当我选择0时,程序删除第一个索引,保留索引1和2。
  • 当我选择2时,程序什么也不做。
  • 当我选择1时,程序将删除索引1,保留索引2 ...等。>
  • 此方法有什么问题?

我想创建一个类似于家庭预算的程序,所以我有一个AmountModel类(我知道Integer对于id不太好,但现在不成问题):import java.time.LocalDate; ...

java arraylist iterator
4个回答
0
投票

您的break语句仅在第一次迭代中中断while循环。因此,仅当第一个am.getId()与您的拳头输入匹配时,它才有效。同样,您的sc.nextInt()将继续扫描下一个可用的输入,将其从while循环中删除。

static Scanner sc = new Scanner(System.in);
public List<AmoutModel> deleteAmount() {
    Iterator<AmoutModel> it = amountList.iterator();
    Integer scId = sc.nextInt();
    while (it.hasNext()) { 
        System.out.println("Choose index to delete ");
        AmoutModel am = it.next();
        if (am.getId().equals(scId)) {
            it.remove();
            break;
        }
    }
    return amountList;
}

1
投票

您应该将输入逻辑与删除逻辑分开,并接受列表作为参数。


1
投票

欢迎使用堆栈溢出!


-1
投票

请在循环外部调用sc.nextInt(),否则它将在每次循环返回时运行,因为每次循环结束时都会重新评估条件。也可以使用列表的删除方法

© www.soinside.com 2019 - 2024. All rights reserved.