2017-12-04 16 views
0

私はクラスCustomerとクラスBankを持っていますので、銀行クラスには顧客のarraylistにCustomerを追加するメソッドがあります。また、arraylistで顧客を検索して削除するメソッドが必要ですそれ(arraylistから削除)、どうすればいいですか?Java - 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){ 

} 

Customerクラス -

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のメソッドを呼び出しますが、私はどのようにウィジェットを実行するのか分かりませんh deleteAccountメソッド、それを動作させる方法?

ユーザー入力がArraylistにあるかどうか最初に確認し、そこにある場合はそこから削除する必要があります。

私は入力がStringでArraylistがCustomerインスタンスであることを認識していますが、顧客はconstractorでString nameを取るため、このように動作させることはできますか?

+0

ループは、比較します。 – SomeJavaGuy

答えて

1

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

} 
をit'sが等しい、取り除くときは、このビットを助ける

}

ホップ...

+0

ありがとう、私はすべての答えを読んで、私はそうだと思う、最善の方法はマップを作ることであり、Arraylistではないと思う。 –

+0

私は現在あなたのコードを使用していますが、私はマップが私の例にとって完璧だった理由を理解しています。ありがとうございます。 –

1

リスト全体を繰り返し、指定された名前がリスト内の顧客から検索された名前と等しいかどうかを確認し、そうであれば削除します。

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

    } 
+0

ありがとう、それは働いた:) –

2

私は、ArrayListの代わりにHashMapオブジェクトを使用することをお勧めします。 HashMapのは、あなたが this.customers.put(name,customer) を行うことができますし、削除、アカウントにあなたが this.customers.remove(name)

を行うことができますオブジェクトのセット(衣装)addCustomerで

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

にキー(あなたのケースで貸衣装名)のセットにマッピング

そうでない場合はティモシーにより示唆されるように、あなたは、リストを反復処理することができますが、これは、より自然で、より効率的である

+0

私はHashMapがこれを行う最善の方法だと思う... ...ちょうどあなたが "重複"顧客(同じ名前)を追加すると、最初の顧客は交換されます –

0

削除する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"); 
    } 

Btw。私は、適切な方法ではありませんあなたが与えられた名前を持つ顧客が既に存在する場合は、「addCustomer」...名前でトリック

+0

これはプログラムはリストを2回実行します。また、 'Customer'クラスが' hashCode'と 'equals'を実装する必要があります。これは現在行われていないようです。 – Henrik

+0

お客様を削除する場合は、2番目の「実行」がありますか? なぜ私のソリューションはhashCodeとequalsを必要とするのですか?ArrayList.removeはこの「問題」のためのポインタ比較を行います –

+1

2番目のポイントで同意します。参照平等で十分であるはずです。最初の実行は、名前に基づいて顧客を見つけることです。 2回目の実行は 'customers.remove'です。これは削除が必要なインスタンスが出現するまでリストを通って実行されます。 – Henrik

1

に削除するアカウントを行う必要があります

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

よう 何かを確認するべきだと思います。同じ名前の複数の顧客がいる可能性があるためです。したがって、口座番号は正しいオプションになります。

それでもあなたは、次のチェック、顧客名でアカウントを削除します:(1)の代わりにO(n)のOになりますので、存在する/削除、私は地図を使って好み

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

マップを使用すれば、簡単にこれを達成できます。 – Datta

+0

ありがとう、おそらくマップを使用してこれを行うための最良の方法です。 –

関連する問題