我有一个程序需要能够搜索'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 :(得分:2)
怎么样:
if (title == null || bookList.get(x).title.contains(title))
假设bookList.get(x).title
是一个字符串。
答案 1 :(得分:0)
String.indexOf()是一种简单的方法。
String s1 = "a b c";
s1.indexOf("b")
将返回2(我认为)。如果您尝试使用“x”,它将返回-1,因为找不到它。检查http://download.oracle.com/javase/6/docs/api/java/lang/String.html#indexOf(java.lang.String)
上的API正则表达式可能是更好的方法。
作为一个注释,4个嵌套级别令人困惑,如果可能应该避免。
答案 2 :(得分:0)
首先,将bookList.get(x)表达式提取到局部变量中,这样就不必在条件中多次重复它。
您可以使用name.indexOf(“Java”)&gt; -1或name.contains(“Java”)来匹配子字符串
答案 3 :(得分:0)
在您的条件中使用String.contains(pattern)方法: 例如。 booktitle.contains( “Java” 的);
答案 4 :(得分:0)
String.indexOf(..)将起作用。我想你可能也想要toLowerCase()书名和标准。另外你关心订单吗?我的意思是,搜索“Java编程”应该匹配上面的两个标题,即使在第二个单词是在另一个顺序中,“in”在它们之间?如果是这样,您将要分割(“\ s +”)并单独查找每个单词。