Java-搜索并从ArrayList删除对象



所以我有班级客户和班级银行,银行类具有将客户添加到客户列表中的方法,并且还必须有一种方法来搜索客户列表中的客户并将其删除(从arraylist中删除),我该怎么做?

银行类 -

private ArrayList<Customer> customers = new ArrayList<>();
public void addCustomer(String name){
    Customer customer = new Customer(name);
    customers.add(customer);
    System.out.println("new customer " + customer.getName() + " added");
}
public void deleteAccount(String name){
}

客户类 -

private String name;
private double balance;
public Customer(String name) {
    this.name = name;
}
public String getName() {
    return name;
}
@Override
public String toString() {
    return "Customer " +
            "name :'" + name + ''' +
            '}';
}

主 -

public static void deleteAccount(){
    System.out.println("Enter the name you want to delete");
    String name = scanner.nextLine();
    scanner.nextLine();
    bank.deleteAccount(name);
}

您可以看到,主类的方法可以从用户中获取输入类型字符串,然后使用该输入来调用银行类的deleteaccount方法,但是我不知道如何继续使用Deleteaccount方法,如何制作它工作?

我需要首先检查用户输入是否在ArrayList中的东西,然后如果有。

我确实意识到输入是字符串,而arrayList是客户实例,但是客户只在Constractor中使用字符串名称,所以我可以这样做吗?

我建议使用hashmap对象而不是arraylist。hashmap映射一组键(在您的情况下的顾客名称)到一组对象(the the costumer)

HashMap<String,Customer> customers = new HashMap<String,Customer>();

在AddCustomer中可以做 this.customers.put(name,customer)在删除帐户中,您可以做 this.customers.remove(name)

否则,您可以按照蒂莫西(Timothy)的建议在列表上迭代,但这更自然,更高效

我更喜欢使用地图,因此删除/存在将在O(1)而不是O(n)

public class Bank {
private Map<String,Customer> customers = new HashMap<>();
public void addCustomer(String name){
    Customer customer = new Customer(name);
    customers.put(customer.getName(),customer);
    System.out.println("new customer " + customer.getName() + " added");
}
// O(1) -- no need to iterate over an array for deleting customer
public boolean deleteAccount(String name){
    if(customers.containsKey(name)){
        customers.remove(name);
        return true;
    }
    return false;
}
@Override
public String toString() {
    return "Bank{" +
            "customers=" + customers +
            '}';
}
public static void main(String[] args){
    Bank bank = new Bank();                 // create Bank object
    bank.addCustomer("Jhon");       // insert some customer
    bank.addCustomer("Doe");
    System.out.println(bank);
    bank.deleteAccount("Yossi");    // not exists - return false
    bank.deleteAccount("Doe");      // removed - return true
    System.out.println(bank);
}

}

跳上这个帮助...

在列表上迭代并检查提供的名称是否等于从列表中从客户中检索的名称,如果是的,请删除。

public void deleteAccount(String name){
      Iterator<Customer> itr=  customers.iterator();
      while(itr.hasNext()){
          String cuName = itr.next().getName();
          if(cuName.equalsIgnoreCase(name)){
              //delete it from list
              //break out of loop
              itr.remove();
              break;
          }
      }
    }

按名称删除帐户不是正确的方式。因为有多个具有相同名称的客户。因此,删除帐户wiht帐号将是正确的选项。

仍然需要按客户名称删除帐户,然后检查以下内容:

Customer custToDelete = null;
for(Customer customer:customers){
        if(customer.getName().equals(name))
        custToDelete = customer;
}
if(custToDelete==null)
    System.out.println("No customer found");
else
    customers.remove(custToDelete);

删除Java 8:

  Optional<Customer> customerToDelete = customers.stream().filter(cust->cust.getName().equals(name)).findFirst();
  if(customerToDelete.isPresent()){
    customers.remove(customers);
  }else{
    System.out.println("Customer does not exist");
  }

顺便说一句。我认为如果已经存在给定名称的客户,您应该检查" AddCustomer" ...像

 customers.stream().filter(cust->cust.getName().equals(name)).count()

应该做技巧

最新更新