簡體   English   中英

Java-從Arraylist中搜索和刪除對象

[英]Java - Search and Delete an object from Arraylist

因此,我有Customer類和Bank類,bank類具有將Customer添加到Customer的數組列表中的方法,並且還必須具有在arraylist中搜索Customer並將其刪除(從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);
}

如您所見,主類具有從用戶接受輸入類型String的方法,然后使用該輸入調用Bank類的deleteAccount方法,但是我不知道如何繼續deleteAccount方法,如何使其工作?

我需要一些東西,首先檢查用戶輸入是否在Arraylist中,然后從那里刪除它。

我確實意識到輸入是String,而Arraylist是Customer實例,但是Customer只在承包商中使用String名稱,那么我可以這樣工作嗎?

我建議使用HashMap對象而不是ArrayList。 HashMap將一組鍵(在您的情況下為客戶名稱)映射到一組對象(客戶)

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

在addCustomer中,您可以執行this.customers.put(name,customer) ;在刪除帳戶中,您可以執行this.customers.remove(name)

否則,您可以按照蒂莫西(Timothy)的建議遍歷列表,但這是更自然,更有效的方法

遍歷列表,檢查提供的名稱是否等於列表中從客戶檢索的名稱,如果是,則將其刪除。

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

    }

按名稱刪除帳戶是不正確的方法。 因為有多個同名客戶的機會。 因此,刪除帶有帳號的帳號是正確的選擇。

仍然要按客戶名稱刪除帳戶,然后檢查以下內容:

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

我更喜歡使用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);

}

}

希望這個幫助...

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

應該可以

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM