search in java ArrayList

前端 未结 8 1878
别跟我提以往
别跟我提以往 2020-12-03 05:04

I\'m trying to figure out the best way to search a customer in an ArrayList by its Id number. The code below is not working; the compiler tells me that I am mis

相关标签:
8条回答
  • 2020-12-03 05:46

    In Java 8:

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

    It might also be better to change the return type to Optional<Customer>.

    0 讨论(0)
  • 2020-12-03 05:47

    The compiler is complaining because you currently have the 'if(exist)' block inside of your for loop. It needs to be outside of it.

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

    That being said, there are better ways to perform this search. Personally, if I were using an ArrayList, my solution would look like the one that Jon Skeet has posted.

    0 讨论(0)
  • 2020-12-03 05:48

    Others have pointed out the error in your existing code, but I'd like to take two steps further. Firstly, assuming you're using Java 1.5+, you can achieve greater readability using the enhanced for loop:

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

    This has also removed the micro-optimisation of returning null before looping - I doubt that you'll get any benefit from it, and it's more code. Likewise I've removed the exists flag: returning as soon as you know the answer makes the code simpler.

    Note that in your original code I think you had a bug. Having found that the customer at index i had the right ID, you then returned the customer at index id - I doubt that this is really what you intended.

    Secondly, if you're going to do a lot of lookups by ID, have you considered putting your customers into a Map<Integer, Customer>?

    0 讨论(0)
  • 2020-12-03 05:56
    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
    }
    
    0 讨论(0)
  • 2020-12-03 06:01

    I did something close to that, the compiler is seeing that your return statement is in an If() statement. If you wish to resolve this error, simply create a new local variable called customerId before the If statement, then assign a value inside of the if statement. After the if statement, call your return statement, and return cstomerId. Like this:

    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;
            }
    
            int customerId;
    
            if(exist) {
                customerId = this.customers.get(id);
            } else {
                customerId = this.customers.get(id);
            }
        }
        return customerId;
    }
    
    0 讨论(0)
  • 2020-12-03 06:09

    You're missing the return statement because if your list size is 0, the for loop will never execute, thus the if will never run, and thus you will never return.

    Move the if statement out of the loop.

    0 讨论(0)
提交回复
热议问题