【问题标题】:Java - Search and Delete an object from ArraylistJava - 从 Arraylist 中搜索和删除对象
【发布时间】:2017-12-04 09:01:51
【问题描述】:

所以我有类 Customer 和类 Bank ,银行类具有将 Customer 添加到 Customers 的数组列表的方法,并且还必须具有在数组列表中搜索 Customer 并将其删除(从数组列表中删除)的方法,如何我做吗?

银行类 -

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);
}

如您所见,主类具有从用户获取输入类型 String 的方法,然后使用该输入调用 Bank 类的 deleteAccount 方法,但我不知道如何继续使用 deleteAccount 方法,如何制作工作吗?

我需要一些东西,首先检查用户输入是否在 Arraylist 中,如果有,然后将其从那里删除。

我知道 input 是 String 并且 Arraylist 是 Customer 实例,但是 Customer 只在构造函数中接受 String 名称,所以我可以让它这样工作吗?

【问题讨论】:

  • 循环,比较,如果相等,删除。

标签: java arraylist


【解决方案1】:

我建议使用 HashMap 对象而不是 ArrayList。 HashMap 将一组键(在您的情况下为客户名称)映射到一组对象(客户)

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

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

否则,您可以按照 Timothy 的建议遍历列表,但这更自然、更高效

【讨论】:

  • 我认为 HashMap 是做到这一点的最佳方式,...请注意,只要您添加“重复”客户(同名),第一个客户就会被替换
【解决方案2】:

我更喜欢使用 Map,所以删除/存在将在 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);

}

}

这个帮助有点...

【讨论】:

  • 谢谢,我通读了所有答案,我认为是的,最好的方法是制作 Map 而不是 Arraylist 。
  • 我目前正在使用您的代码,现在我明白为什么 map 非常适合我的示例,非常感谢。
【解决方案3】:

遍历列表并检查提供的名称是否等于从列表中的客户检索到的名称,如果是则删除它。

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;
          }
      }

    }

【讨论】:

    【解决方案4】:

    按名称删除帐户是不正确的方法。因为有多个客户同名的机会。所以删除账号是正确的选择。

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

    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);
    

    【讨论】:

    • 如果你使用地图,那么你可以很容易地做到这一点。
    • 谢谢,使用地图可能是最好的方法。
    【解决方案5】:

    删除 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()
    

    应该做的伎俩

    【讨论】:

    • 这会使程序在列表中运行两次。另外,需要Customer 类来实现hashCodeequals,目前似乎没有这样做。
    • 如果您想删除客户,第二个“贯穿”在哪里?以及为什么我的解决方案需要 hashCode 和 equals... ArrayList.remove 进行指针比较,这对于这个“问题”很好
    • 同意第二点。引用相等就足够了。第一次运行是根据名称查找客户。第二次运行是customers.remove,它遍历列表直到遇到需要移除的实例。
    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 2015-08-05
    • 2010-11-21
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多