2010-10-25 121 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 +”)并单独查找每个单词。