Поиск объекта arraylist путаница - PullRequest
0 голосов
/ 22 декабря 2011

Я написал метод поиска объекта в моем arralist, однако мне нужно, чтобы этот поиск взял два параметра и сравнил их с описанием объекта. Меня смущает то, что я не знаю, как заставить мой метод принимать два параметра, и эти два параметра сравниваются с одним описанием. например, описание объекта: синий мустанг

Теперь метод поиска должен принимать два параметра, в данном случае одну строку "Blue" и одну строку "Mustang", и я не имею понятия, как это сделать. Я нашел способ просто написать полное описание в виде одного параметра и работает отлично. Я оставляю метод, который я пытался изменить, чтобы искать два параметра, а также метод, который принимает один параметр и работает нормально. Важно отметить, что метод также должен искать автомобили, которые не находятся в аренде, поэтому есть также сравнение с датой проката, поскольку, если автомобиль в аренде, будет иметь один, а если нет, то не будет.

Попытка изменить его для поиска двух параметров:

public Car searchCar(String description, String description2)
{
    for (Car car : cars) {
        if (car.getDescription().equals(description) && car.getDescription().equals(description2) && car.getHireDate().equals("")) {

            System.out.println( ": " + car.getDescription() + " rate: £" + car.getDailyRate() + " Down payment: £"+ car.getDownPayment());
            return car;

        }
        else if (car.getHireDate() != ("")) {
            System.out.println("This car is rented!!");
        }
        else {

        }
    }
    return null;
}

Это тот, который принимает один параметр и работает нормально:

public Car searchCar(String description)
{
    for (Car car : cars) {
        if (car.getDescription().equals(description) && car.getHireDate().equals("")) {

            System.out.println( ": " + car.getDescription() + " rate: £" + car.getDailyRate() + " Down payment: £"+ car.getDownPayment());
            return car;

        }
        else if (car.getHireDate() != ("")) {
            System.out.println("This car is rented!!");
        }
        else {

        }
    }
    return null;
}

Ответы [ 6 ]

1 голос
/ 22 декабря 2011

описание должно совпадать с описанием2 Вы могли бы сделать:

String fulldescription=description+" "+description2;

, а затем

if (car.getDescription().equals(fulldescription)...

другой подход может быть

 if (car.getDescription().indexOf(description)>0 && car.getDescription().indexOf(description2)>0 )...
0 голосов
/ 22 декабря 2011

Рассмотрите возможность инкапсуляции вашего поиска / соответствия в классе, который вы можете расширить, чтобы включить любые критерии поиска, которые вам требуются.

Вот пример, который удовлетворяет вашим текущим требованиям.

 class CarSearch {

    private boolean isIncludeHired;
    private String[] descriptionWords;
    private boolean isCaseInsensitive;

    public void setIncludeHired(boolean b) {
        isIncludeHired = b;
    }

    public void setCaseInsensitive(boolean b) {
        this.isCaseInsensitive = b;
    }

    public void setDescriptionWords(String[] words) {
        this.descriptionWords = words;
    }

    public boolean matches(Car car) {

        boolean matches = true;

        if (!isIncludeHired) {
            if (car.getHireDate() != null) {
                matches = false;
            }
        }

        if (matches && descriptionWords != null) {
            String description = car.getDescription();
            if (isCaseInsensitive) {
                description = description.toLowerCase();
            }
            boolean allMatch = true;
            for (String word: descriptionWords) {
                if (isCaseInsensitive) {
                    word = word.toLowerCase();
                }
                if (!description.contains(word)) {
                    allMatch = false;
                    break;
                }
            }
            matches = allMatch;
        }

        return matches;
    }

    public List<Car> search(List<Car> cars) {
        List<Car> matched = new ArrayList<Car>();

        for (Car car: cars) {
            if (matches(car)) {
                matched.add(car);
            }
        }
        return matched;
    }
}

Итактеперь вы можете сделать что-то такое:

    CarSearch search = new CarSearch();
    search.setCaseInsensitive(true);
    search.setIncludeHired(false);
    search.setDescriptionWords(new String[]{"blue", "mustang"});

    List<Car> matches = search.search(cars);

Вы также можете легко изменить свой класс CarSearch, чтобы разрешить другие вещи, например, точное совпадение, поиск по дате проката, поиск по регистрации и т. д.

0 голосов
/ 22 декабря 2011

Я бы предложил использовать contains и toLowerCase для поиска строк. Также рассмотрим переменный аргумент поиска метод, подобный этому:

public Car searchCar(String...descriptions) {
    for (Car car : cars) {
        if (car.getHireDate().equals("")) {
            for (String d : descriptions) {
               // assuming car.getDescription() != null
               if (car.getDescription().toLowerCase().contains(d.toLowerCase())) {
                  System.out.println( ": " + car.getDescription() + " rate: £" + car.getDailyRate() + " Down payment: £"+ car.getDownPayment());
                  return car;
               }
            }
        }
        else
            System.out.println("This car is rented!!");
    }
    return null;
}

Затем вы можете вызвать этот метод, как:

Car c1 = searchCar("blue");

OR

Car c1 = searchCar("blue", "toyota");

OR

Car c1 = searchCar("blue", "red", "toyota", "mustang", "honda");
0 голосов
/ 22 декабря 2011

Чтобы проверить наличие подстрок, вы можете использовать indexOf() (документы) :

if (-1 != car.getDescription().indexOf(description) && 
    -1 != && car.getDescription().indexOf(description2) &&
    car.getHireDate().equals("")) {

Возможно, вы захотите сделать сравнение без учета регистра.

0 голосов
/ 22 декабря 2011

Во-первых, вы должны определить, необходимы ли точные совпадения или параметры должны содержаться, и в описании может быть дополнительный текст.

Точные совпадения

Для точных совпадений вы можете использовать условие or:

if ( (car.getDescription().equals(description) | car.getDescription().equals(description2) ) && car.getHireDate().equals("") ) {
   ... 
}

Это означает, что если описание точно соответствует description или description2, вы получитехит.

В качестве альтернативы вы можете объединить параметры, если знаете порядок:

if ( car.getDescription().equals(description + " " + description2) && car.getHireDate().equals("") ) {
   ... 
}

Это будет соответствовать «Голубому мустангу», но не «Синему мустангу».

При желании вы можете сделать объединенную строку регулярным выражением, чтобы учесть произвольный пробел:

if ( car.getDescription().matches("\\s*\\b" + description + "\\b\\s*\\b" + description2 + "\\b\\s*") && car.getHireDate().equals("") ) {
   ... 
}

Это будет соответствовать "Blue Mustang" и т. Д., Но не "BlueMustang" из-за требований к границе слова ("\\b").

Обратите внимание, что существует гораздо больше возможностей, поэтому вы должны сначала определить, как вы хотите сопоставить.

Параметры, содержащиеся

Если вы хотитечтобы получить все описанияЕсли содержит оба параметра, используйте contains(...) вместо:

if ( car.getDescription().contains(description) && car.getDescription().contains(description2) && car.getHireDate().equals("") ) {
   ... 
}

Обратите внимание, что это также будет соответствовать "Blue Ford Mustang" (параметры "Blue" и "Mustang" являются параметрами).

0 голосов
/ 22 декабря 2011

Маловероятно, что описание будет точно равно обоим параметрам.Возможно, вы пытаетесь сопоставить только часть описания?

Что-то вроде содержит может представлять интерес.

Также обратите внимание, что эта строка:

else if (car.getHireDate() != ("")) {

не будет работать так, как вы ожидаете;вы правильно сравниваете строки в предыдущем выражении (используя equals), но не можете это сделать здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...