17

ArrayListID番号で顧客を検索する最良の方法を見つけようとしています。以下のコードは機能しません。returnコンパイラーは、ステートメントが欠落していると教えてくれます。

Customer findCustomerByid(int id){
    boolean exist=false;

    if(this.customers.isEmpty()) {
        return null;
    }

    for(int i=0;i<this.customers.size();i++) {
        if(this.customers.get(i).getId() == id) {
            exist=true;
            break;
        }

        if(exist) {
            return this.customers.get(id);
        } else {
            return this.customers.get(id);
        }
    }

}

//the customer class is something like that
public class Customer {
    //attributes
    int id;
    int tel;
    String fname;
    String lname;
    String resgistrationDate;
}
4

8 に答える 8

58

他の人が既存のコードのエラーを指摘していますが、私はさらに 2 つのステップを踏みたいと思います。まず、Java 1.5 以降を使用していると仮定すると、拡張された for ループを使用して読みやすくすることができます。

Customer findCustomerByid(int id){    
    for (Customer customer : customers) {
        if (customer.getId() == id) {
            return customer;
        }
    }
    return null; 
}

これにより、ループする前に戻るというマイクロ最適化も削除されましたnull-それから利益が得られるとは思えず、コードが増えます。同様に、フラグを削除しましたexists。答えがわかったらすぐに戻ると、コードが簡単になります。

元のコードでは、バグがあったと思います。iindex の顧客が正しい ID を持っていることがわかったので、indexの顧客を返しましたid。これが本当に意図したものであるかどうかは疑問です。

次に、ID で多くのルックアップを行う場合、顧客を に入れることを検討しましたMap<Integer, Customer>か?

于 2009-06-12T06:28:14.077 に答える
18

現在、for ループ内に「if(exist)」ブロックがあるため、コンパイラが不平を言っています。それはそれの外にある必要があります。

for(int i=0;i<this.customers.size();i++){
        if(this.customers.get(i).getId() == id){
            exist=true;
            break;
        }
}

if(exist) {
    return this.customers.get(id);
} else {
    return this.customers.get(id);
}

そうは言っても、この検索を実行するためのより良い方法があります。個人的には、ArrayList を使用していた場合、私のソリューションは Jon Skeet が投稿したもののようになります。

于 2009-06-12T06:18:02.697 に答える
11
Customer findCustomerByid(int id){
    for (int i=0; i<this.customers.size(); i++) {
        Customer customer = this.customers.get(i);
        if (customer.getId() == id){
             return customer;
        }
    }
    return null; // no Customer found with this ID; maybe throw an exception
}
于 2009-06-12T06:18:30.043 に答える
2

リストのサイズが 0 の場合、for ループが実行されないため、return ステートメントがありません。

if ステートメントをループの外に移動します。

于 2009-06-12T06:18:39.623 に答える
2

そのトピックはかなり古いものですが、何か追加したいと思います。クラスを上書きequalsして を比較するgetId場合は、次を使用できます。

customer = new Customer(id);
customers.get(customers.indexOf(customer));

もちろん、IndexOutOfBoundsnull ポインターまたはカスタムに変換される -Exceptionをチェックする必要がありますCustomerNotFoundException

于 2012-10-11T07:59:24.207 に答える
1

Java 8 では:

Customer findCustomerByid(int id) {
    return this.customers.stream()
        .filter(customer -> customer.getId().equals(id))
        .findFirst().get();
}

戻り値の型を に変更した方がよい場合もありますOptional<Customer>

于 2015-10-20T17:48:03.370 に答える