【问题标题】:Searching for a string in an Arraylist, without having to input the whole string在 Arraylist 中搜索字符串,无需输入整个字符串
【发布时间】:2023-04-02 06:33:01
【问题描述】:

我写了一个类

Book(String title, String author)

然后我有另一个类 Register,包含一个包含所有书籍的数组列表。

我现在正在编写一种方法,我希望能够通过搜索作者找到一本书,但这里的困难在于这种搜索方法能够找到这本书而无需输入整个标题.怎么样?

这是我写的全部内容:

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  
    }
}

【问题讨论】:

  • 如何进行正则表达式搜索并根据您可能拥有的任何条件进行模式匹配?
  • 您需要提供更详细的信息 - 您想在字符串的任何部分中查找字符串,还是仅在开头?您可以使用正则表达式来执行此操作,但或者,您可以查看字符串匹配算法(Boyer-Moore 或 Knuth-Pratt)之类的东西。

标签: java string search arraylist


【解决方案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);
    }
  }

也许?

【讨论】:

    【解决方案2】:

    如果您想使用ArrayList.contains(),则必须覆盖equals() 才能使用它们的author 字段比较书籍。但是,这限制了您只能按作者进行搜索。

    如果您想更灵活地查找内容,我认为您可能需要考虑多个 HashMaps 将作者映射到书籍集和标题到特定书籍,或类似的东西。不过设置起来有点尴尬……

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

    【讨论】:

    • 感谢您的帮助!我想我正在发生一些事情,通过使用字符串中的 indexOf,我现在可以找到与我正在搜索的内容匹配的字符串,现在的问题是我想返回多本书,但它只允许返回一本书。 public Book searchBook(String Author2){ ArrayList kopia = new ArrayList (); for(int i = 0; i= 0){ kopia.添加(reg.get(i)); } } for(int k = 0; k
    • 在这种情况下,您可以返回整个ArrayList
    【解决方案3】:

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

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

    【讨论】:

    • 感谢您的帮助!我想我正在发生一些事情,通过使用字符串中的 indexOf,我现在可以找到与我正在搜索的内容匹配的字符串,现在的问题是我想返回多本书,但它只允许返回一本书。 public Book searchBook(String Author2){ ArrayList kopia = new ArrayList (); for(int i = 0; i= 0){ kopia.添加(reg.get(i)); } } for(int k = 0; k
    • 使用我上面回答的方法..它以数组列表的形式返回多本书..如果有任何问题,请告诉我..
    【解决方案4】:

    这个怎么样?

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

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

    【讨论】:

    • 感谢您的帮助!我想我正在发生一些事情,通过使用字符串中的 indexOf,我现在可以找到与我正在搜索的内容匹配的字符串,现在的问题是我想返回多本书,但它只允许返回一本书。 public Book searchBook(String Author2){ ArrayList kopia = new ArrayList (); for(int i = 0; i= 0){ kopia.添加(reg.get(i)); } } for(int k = 0; k
    • Nvm,我了解您的解决方案,效果很好!谢谢!
    • 如果它只有一本书,您可以将返回类型更改为 Book,并且在 if 语句中您可以返回 nook 而不是将其添加到 kopia。
    猜你喜欢
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    相关资源
    最近更新 更多