搜索对象arraylist混淆

时间:2011-12-22 15:32:16

标签: java search methods parameters arraylist

我写了一个搜索我的arralist中的对象的方法,但是我需要这个搜索来获取两个参数并将它们与对象的描述进行比较。令我困惑的是,我不知道如何使我的方法采用两个参数,并且这两个参数与一个描述相比较。  例如物体描述:蓝色野马

现在搜索方法必须采用两个参数,在这种情况下,一个字符串“蓝色”和一个字符串“野马”,我不知道如何做到这一点。我找到了一种方法,可以将完整的描述作为一个参数编写并完美地运行。我要离开我试图改变的方法来寻找两个参数,以及采用一个参数并且工作正常的方法。值得一提的是,该方法还需要寻找没有借出的汽车,这就是为什么还有一个与租用日期的比较,因为如果汽车租借将有一个,如果不是,它将不会。 / p>

尝试更改它以查找两个参数:

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 个答案:

答案 0 :(得分:1)

描述需要与description2相同 你可以这样做:

String fulldescription=description+" "+description2;

然后

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

可以采用不同的方法

 if (car.getDescription().indexOf(description)>0 && car.getDescription().indexOf(description2)>0 )...

答案 1 :(得分:0)

描述不太可能完全等于两个参数。也许您只是想匹配描述的部分

contains之类的东西可能会引起人们的兴趣。

另请注意这一行:

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

不会按预期工作;你正确地比较了前一个语句中的字符串(使用equals)但是在这里没有这样做。

答案 2 :(得分:0)

首先,您应该定义是否需要完全匹配,或者是否应该包含参数,并且说明中可能还有其他文本。

完全匹配

对于完全匹配,您可以使用or-condition:

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

这意味着,如果描述完全description description2匹配,则会受到影响。

或者,如果您知道顺序,则可以连接参数:

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

这将匹配“Blue Mustang”而不是“Mustang Blue”。

可选地,您可以使连接字符串成为正则表达式,以允许任意空格:

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

由于字边界要求("\\b"),这将匹配“Blue Mustang”等,但不匹配“BlueMustang”。

请注意,还有更多可能性,因此您应该首先定义匹配方式。

包含的参数

如果您想获得包含这两个参数的所有描述,请改用contains(...)

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

请注意,这也与“蓝色福特野马”相匹配(“蓝色”和“野马”为参数)。

答案 3 :(得分:0)

为了测试子串的出现,您可以使用indexOf() (docs)

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

你可能也希望比较不区分大小写。

答案 4 :(得分:0)

我建议使用containstoLowerCase进行字符串搜索。还要考虑变量参数搜索方法,如下所示:

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

答案 5 :(得分:0)

考虑将您的搜索/匹配封装在一个可以扩充的类中,以包含您需要的任何搜索条件。

以下是满足您当前要求的示例。

 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课程以允许其他内容,例如:完全匹配,按雇用日期搜索,按注册搜索等。