2011-12-22 110 views
0

我写了一个搜索arralist对象的方法,但是我需要这个搜索来获取两个参数并将它们与对象的描述进行比较。令我困惑的是,我不知道如何让我的方法取两个参数,并将这两个参数与单个描述进行比较。 例如对象描述:蓝色野马搜索对象数组列表混淆

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

试图改变它来寻找两个参数:

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; 
} 
+0

您是否想要_exact_匹配或所有对象_containing_参数? – Thomas 2011-12-22 15:35:24

回答

0

这是不太可能的描述是正好等于两参数。也许你试图匹配部分的描述?

类似contains可能是有趣的。

还要注意的是这一行:

else if (car.getHireDate() != ("")) { 
像您期望

将无法​​正常工作;您在前面的语句中正确地比较了字符串(使用equals),但在此处未能这样做。

0

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

精确匹配

精确匹配,你可以使用或条件:

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

这意味着,如果描述正是比赛descriptiondescription2你得到一击。

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("")) { 
    ... 
} 

这将匹配“   蓝   野马   ”等。但由于字边界要求("\\b")而不是“BlueMustang”。

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

参数包含

如果你想拿到包含这两个参数都说明,使用contains(...)代替:

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

注意,这将匹配“蓝色福特野马”,太( “蓝色”和“野马”是参数)。

0

为了测试子的发生,你可以使用indexOf() (docs)

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

你可能要作出比较不区分大小写了。

1

说明需要是相同的DESCRIPTION2 你可以这样做:

String fulldescription=description+" "+description2; 

然后

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

不同的方法可以

if (car.getDescription().indexOf(description)>0 && car.getDescription().indexOf(description2)>0)... 
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"); 
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类,允许其他的东西,如完全匹配,按出租日期搜索,按注册搜索等。