我在这里创建了一个班级:
class book{
String book_nm;
String author_nm;
String publication;
int price;
book(String book_nm,String author_nm,String publication,int price){
this.book_nm=book_nm;
this.author_nm=author_nm;
this.publication=publication;
this.price=price;
}
}
现在我想根据作者和书名来搜索特定值
ArrayList<book> bk = new ArrayList<book>();
我已经使用开关盒创建了菜单驱动程序
case 3: System.out.println("Search:"+"\n"+"1.By Book Name\n2.By Author Name");
Scanner s= new Scanner(System.in);
int choice=s.nextInt();
while(choice<3){
switch(choice){
case 1:System.out.println("Enter the name of the book\n");
String name=s.next();
-------
case 2:System.out.println("Enter the name of the author\n");
String name=s.next(); ------
}
}
我知道如何在ArrayList中查找和搜索特定元素,而不是对象。
答案 0 :(得分:1)
使用ArrayList上的循环可以解决您的问题,这是一种幼稚的方法并且过时。
下面是代码。
import java.util.ArrayList;
public class HelloWorld{
public static void main(String []args){
String author_name = "abc";
ArrayList<book> bk = new ArrayList<book>();
bk.add(new book("abc", "abc", "abc", 10));
bk.add(new book("mno", "mno", "abc", 10));
bk.add(new book("xyz", "abc", "abc", 10));
ArrayList<book> booksByAuthor = new ArrayList<book>();
for(book obj : bk)
{
if(obj.author_nm == author_name)
{
booksByAuthor.add(obj);
}
}
}
}
class book{
public String book_nm;
public String author_nm;
public String publication;
public int price;
public book(String book_nm,String author_nm,String publication,int price){
this.book_nm=book_nm;
this.author_nm=author_nm;
this.publication=publication;
this.price=price;
}
}
希望您能从中得到启发。
答案 1 :(得分:0)
下面的代码基于您的search (filter)
返回一个列表:
List< Book> result = bk.stream().filter(book -> "booknamehere".equals(book.getBook_nm()))
.filter(book -> "authernamehere".equals(book.getAuther_nm()))
.collect(Collectors.toList());
答案 2 :(得分:0)
首先,有一种新方法(使用Java 8+)和旧方法可以做到这一点。新方法将如下所示:
String authorName = s.next();
String bookName = s.next();
List<String> result = bk.stream() // open stream
.filter(book-> book.getBook_nm().equals(bookName) && book.getAuthor_nm().equals(authorName ) )
.collect(Collectors.toList());
另一种(过时的)方式是使用for循环:
ArrayList<book> result = new ArrayList<book>();
for(Book book : bk) //By the way always use Big first letter for name of your Class! (Not book but Book)
{
if(book.getBook_nm().equals(bookName) && book.getAuthor_nm().equals(authorName))
{
result.add(book);
}
}
此后,您可以在两种情况下都打印包含书籍的结果列表。但是,如果您要搜索大量的作者和书名,并且有很多内容,您可以考虑检查一下性能。因为每次搜索都将遍历列表。也许使用Map会有更好的解决方案...
一些其他信息。如果您知道从条件中始终只能找到一个元素,则为导入。例如,在您的情况下,您唯一地找到一本名为X和作者Y的书。不能再有另一本具有相同名称和作者的书。在这种情况下,您可以这样:
新方法(在Java 8之后):
Book res = bk.stream()
.filter(book -> book.getBook_nm().equals(bookName) && book.getAuthor_nm().equals(authorName))
.findFirst()
.get();
旧方法:
Book result = null;
for(Book book : bk)
{
if(book.getBook_nm().equals(bookName) && book.getAuthor_nm().equals(authorName))
{
result = book;
break;
}
}
这样,当您搜索一个元素时它会更快
祝你好运!