我编写了一个在数组中搜索对象的方法,但是我需要这个搜索获取两个参数,并将它们与对象的描述进行比较。让我困惑的是,我不知道如何让我的方法有两个参数,这两个参数与一个单一的描述相比。例:对象描述: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("")) {
你可能也想让比较不区分大小写
我建议使用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");
或
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
类,以允许其他事情,例如精确匹配,按租用日期搜索,按注册搜索等