在Arraylist中搜索字符串,而无需输入整个字符串

时间:2014-04-29 17:38:51

标签: java string search arraylist

我写了一个课

Book(String title, String author)

然后我有另一个类Register,包含一个包含所有书籍的arraylist。

我现在正在编写一种方法,我希望能够通过搜索作者来找到一本书,但这里的难点在于这种搜索方法能够在不必输入整个标题的情况下找到该书。 。怎么样?

以下是我写的所有内容:

public class Book {
     private String title; // titel
     private String author; // författare

     /** Skapar en bok med författaren author och titeln title */   
     public Book(String author, String title) {     
         this.author = author;     
         this.title = title;  
     }

     /** Returnerar namnet på författaren */  
     public String getAuthor() {    
         return author; 
     }

     /** Returnerar titeln */  
     public String getTitle() {  
         return title; 
     }

     /** Returnerar en sträng som består av bokens författare och titel */
     public String toString() {
         return author + "\t" + title; 
     }
}

import javax.swing.*;
public class Dialog {

    /** Skapar ett Dialog-objekt fšr hantering av popup-dialogrutor. */
    public Dialog() {
    }

    /** Visar en dialogruta med hjŠlptexten s dŠr anvŠndaren skall mata in ett 
      * heltal som returneras.
      * Om anvŠndaren anger ett felaktigt vŠrde eller klickar pŒ "avbryt" sŒ 
      * returneras Integer.MAX_VALUE.
      */
    public int readInt(String s) {
        String in = JOptionPane.showInputDialog(s);
        try {
            int i = Integer.parseInt(in);
            return i;
        } catch (NumberFormatException e) {
            return Integer.MAX_VALUE;
        }
    }

    /** Visar en dialogruta med hjŠlptexten s dŠr anvŠndaren skall mata in en 
      * teckenstrŠng som returneras.
      * Om anvŠndaren klickar pŒ "avbryt" sŒ returneras null.
      */
    public String readString(String s) {
        String in = JOptionPane.showInputDialog(s);
        if (in == null) {
            return null;
        } else {
            return in.trim();
        }
    }

    /** Visar en dialogruta med textstrŠngen s. */
    public void printString(String s) {
        JOptionPane.showMessageDialog(null, s, "",JOptionPane.PLAIN_MESSAGE);
    }
}

import java.util.ArrayList;

public class Register {
    private ArrayList<Book> reg;     // registret skall lagras i en ArrayList 

    /** Skapar ett tomt register*/
    public Register(){
        reg = new ArrayList<Book>();
    }

    /**Sätter in boken bok sist i Registret reg*/
    public void addBook(Book bok) {
        reg.add(bok);
    }

    /**Tar bort alla böcker av en viss författare author*/
    public void removeAuthor(String author1) {
        for(int i = 0; i<reg.size(); i++){
            if(reg.get(i).getAuthor().equals(author1)){
                reg.remove(i);
            }
        }
    }

    /**Söka upp alla böcker som gäller för en viss författare.
    Det skall räcka att man anger en del av författarnamnet. 
    Samtliga böcker vars författare passar in skall presenteras med både författare och titel. */
    public Book searchBook(String Author2){
        ArrayList<Book> kopia = new ArrayList <Book>();
        for(int i = 0; i<reg.size();i++){
            for(String string : )
        }
    }

    //...  Konstruktor och alla metoderna för registerhanteringen   

    /** Läser registret från filen med namn fileName. */ 
    public void readFromFile(String fileName) { 
        //...  Se ledning för filhanteringen sist i uppgiften 
    }

    /** Sparar registret på fil med namnet fileName. */
    public void writeToFile(String fileName) {   
        //...  Se ledning för filhanteringen sist i uppgiften  
    }
}

4 个答案:

答案 0 :(得分:1)

类似的东西:

ArrayList<String> matches = new ArrayList<String>();

  Pattern p = Pattern.compile(regex);

  for (Book book:list) {
    if (p.matcher(book.getTitle()).matches()) {
      matches.add(book);
    }
  }

也许?

答案 1 :(得分:0)

如果您想使用ArrayList.contains(),则必须覆盖equals()以使用其author字段来比较图书。但是,这限制了您仅按作者搜索。

如果您希望在查找内容方面更加灵活,我认为您可能需要考虑将作者映射到特定书籍的书籍和书名的多个HashMaps,或者类似的东西。虽然设置它有点尴尬......

编辑:看起来我可能误解了你的问题,但是我会留在这里,以防它以其他方式有用......

答案 2 :(得分:0)

1)将title作为参数传递给您调用的方法

2)仅在方法开始

创建一次列表

3)使用for循环

迭代每个reg对象

4)使用reg.get(i)获取每本书并获取它的标题并将其与传递的字符串(我们正在制作的标题)进行比较,并使用正则表达式进行匹配。

5)如果找到匹配,将该书添加到列表中

6)返回匹配书籍的最终列表

 public List<Book> searchBook(String title){
        ArrayList<Book> kopia = new ArrayList <Book>();
       for(int i = 0; i<reg.size();i++){
           if(reg.get(i).getTitle().matches("(.*)"+title+"(.*)")){
               kopia.add(reg.get(i));
           }

       }
       return kopia;
    }

答案 3 :(得分:0)

这个怎么样?

public List<Book> searchBook(String Author2){
    List<Book> kopia = new ArrayList <Book>();
    for(Book book : reg){
        if(book.getAuthor().equalsIgnoreCase(Author2) || book.getTitle().toLowerCase().indexOf(Author2.toLowerCase()) != -1){
            kopia.add(book);
        }
    }
    return kopia;
}

这只是为了保持简单。你也可以使用正则表达式。