0

姓、名、SIN 番号の 3 つのプロパティを持つ顧客オブジェクトがあります。

ユーザーが顧客の姓と名を入力し、オブジェクトが arraylist で見つかった場合、オブジェクトは削除されます。

private static void deleteCustomer (String lastName, String firstName, List<Customer> accounts)
{
    for (int i = 0; i < accounts.size(); i++)
    {            
        accounts.get(i);
        public int compare (Customer c1, Customer c2) 
        {
            Customer customerOne = (Customer) c1;
            Customer customerTwo = (Customer) c2;
            if (lastName.equals(CustomerOne.getLastName()) && firstName.equals(CustomerOne.getFirstName()))
            {

            }
        }
    }
}

2 人の顧客の名前と姓が同じ場合、ユーザーは SIN 番号を入力するように求められます。そのため、compare メソッドを使用しています。この後どうすればいいのかわからない。

更新された方法:

public static void deleteCustomer (String lastName, String firstName, List<Customer> accounts)
{
    for (Iterator<Customer> iterator = accounts.iterator(); iterator.hasNext();)
    {
        Customer customer = iterator.next();
        if(lastName.equals(customer.getLastName()) && firstName.equals(customer.getFirstName()))
        {
            iterator.remove();
        }
    }
}

これは機能しますが、姓と名が同じすべての顧客が削除されます

4

1 に答える 1

1

質問で説明したように、単に1 人の顧客を削除したい場合は、正しい顧客を見つけて削除した後で、ループを中断する必要があります。

iterator.remove();
break; // breaks the loop

しかし、同じ名と姓を持つ複数の顧客が存在する可能性があるため、アルゴリズムは完全に防げるとは言えません。顧客を区別するために、顧客 ID などを使用する必要があるかもしれません。顧客 ID の場合、使用するデータ構造はおそらくMap<CustomerId, Customer>. その後、id を介して顧客にすばやくアクセスでき、values()メソッドを呼び出すことですべての顧客のコレクションを取得できます。

これに加えて、オリジナルを変更したくない場合は、 Java 8 コンストラクトをList使用することもできます。streamfiltercollect

final List<Customer> newAccountList = accounts.stream()
            .filter(c -> !(Objects.equals(c.getFirstName(), firstName) &&
                    Objects.equals(c.getLastName(), lastName)))
            .collect(Collectors.toList());

上記には、名と姓が一致するエントリを除いてList、元のすべてが含まれています。List

于 2015-01-17T19:13:47.777 に答える