2010-10-25 74 views
1

我有一個程序,需要能夠搜索'book'對象的ArrayList,並決定哪些符合給定的條件。多個字符串和條件匹配?

您可以按名稱,身份證號碼或發佈年份進行搜索。 或只是由上述的任何分類。

目前我使用嵌套的if語句,其中,空值表示字段沒有被指定,並且顯示所有。

for(int x = 0; x<bookList.size(); x++) 
{ 
    if(bookList.get(x).callNum.equals(callNum) || callNum == null) 
    { 
     if(bookList.get(x).title.equals(title) || title == null) 
     { 
      if((bookList.get(x).year>= startDate 
       && bookList.get(x).year <= endDate) || timeFrame == null) 
      { 
       bookList.get(x).ToString(); 
      } 
     } 
    } 
} 

我唯一有問題的地方就是標題變量。我需要它來做字級匹配。因此,如果一本書被稱爲「Java編程」,另一本書被稱爲「面向對象的Java編程」,那麼當搜索尋找「Java」時,兩者都應該被返回。我怎樣才能做到這一點?

我很感謝任何幫助,感謝您的時間!

+0

你並不需要包括'[標籤]'你的問題的標題,我們有標記爲=) – 2010-10-25 21:27:21

+0

此外,你應該考慮換的'條件的順序|| foo = null'子句,短路邏輯將減少事件中'foo'事實上爲'null'的檢查次數。 – 2010-10-25 21:28:45

+0

您不需要嵌套的'if'語句。你可以用'&&'來加入所有的條件(確保所有的東西都加上括號,因爲'&&'比'||'具有更高的優先級)。 – 2010-10-25 21:28:59

回答

0

首先,提取bookList.get(X)表達成一個局部變量,所以你不必多次重複它在你的條件。

您可以使用使用name.indexOf( 「Java」 的)>子字符串匹配 - 1或name.contains( 「Java」 的)

2

如何:

if (title == null || bookList.get(x).title.contains(title)) 

假設bookList.get(x).title是串。

+0

+1'contains'確實是在這裏使用的正確的東西。 – 2010-10-25 22:03:30

0

使用String.contains(模式)方法您的條件: 如。 booktitle.contains(「Java」);

0

String.indexOf(..)將工作。我會假設你可能也會想要toLowerCase()書名和標準。另外你是否關心訂單?我的意思是應該搜索「Java編程」應該匹配上述兩個標題,即使在第二個單詞是在另一個順序和「in」是在他們之間?如果是這樣,你會想拆分(「\ s +」)並單獨查找每個單詞。