搜索对象数组列表混乱



我编写了一个在数组中搜索对象的方法,但是我需要这个搜索获取两个参数,并将它们与对象的描述进行比较。让我困惑的是,我不知道如何让我的方法有两个参数,这两个参数与一个单一的描述相比。例:对象描述:Blue Mustang

现在,搜索方法必须接受两个参数,在这种情况下一个字符串"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;
}

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

String fulldescription=description+" "+description2;

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

另一种方法可以是

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

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

您可能会对contains之类的内容感兴趣。

还要注意这一行:

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

不会像你期望的那样工作;在前面的语句(使用equals)中,您正确地比较了字符串,但在这里没有这样做。

首先,您应该定义是否需要精确匹配,或者是否应该包含参数,并且在描述中可能有额外的文本。

精确匹配

对于精确匹配,可以使用or条件:
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("") ) {
   ... 
}

这将匹配"   Blue ,野马,,等,但不包括"BlueMustang",因为单词边界要求("\b")。

请注意,有更多的可能性,所以你应该首先定义你想要如何匹配。

参数包含

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

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

注意,这也将匹配"Blue Ford Mustang" ("Blue"one_answers"Mustang"是参数)。

为了测试是否存在子字符串,您可以使用indexOf() (docs):

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

你可能也想让比较不区分大小写

我建议使用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");

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

Car c1 = searchCar("blue", "red", "toyota", "mustang", "honda");

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

这是一个符合你目前要求的例子。

 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类,以允许其他事情,例如精确匹配,按租用日期搜索,按注册搜索等

最新更新