从ArrayList对象中搜索特定元素

时间:2018-08-06 09:42:42

标签: java

我在这里创建了一个班级:

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中查找和搜索特定元素,而不是对象。

3 个答案:

答案 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;
     }
}

这样,当您搜索一个元素时它会更快

祝你好运!