2011-12-22 120 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類,允許其他的東西,如完全匹配,按出租日期搜索,按註冊搜索等。