在集合中查找关键字并将其返回

时间:2010-02-19 01:47:26

标签: java

我有一个集合,我将CD,DVD,书籍信息添加到哈希集中。 每个人都有一个关键字,我想搜索一个特定的关键字,并返回特定的书,CD,DVD ...继续输出给你一个想法..

-Book-
Author:   Robert A. Heinlein
# pages   325
title: Starship Troopers
keywords: [science fiction, war, weapons]

-Music-
band:     Grateful Dead
# songs:  12
members:  [Jerry Garcia, Bill Kreutzman, Keith Godcheaux]
title: Europe In '72
keywords: [acid rock, sixties, jam bands]


-Movie-
director: Sofia Coppola
# scenes: 14
cast:     [Bill Murray, Scarlett Johansson]
title: Lost In Translation
keywords: [Japan, loneliness]


>>> items for keyword: science fiction

none

>>> items for keyword: jam bands

none


C:\Java\a03>

我有3节课。

  1. main()的
  2. 图书馆 - 这是我所有添加CD,DVD,书籍的地方。查找等
  3. 使用继承的项目类(CD类,DVd类,书类)。
  4. 在main()中我将信息发送到库类以添加到集合中。 然后我打印出刚刚添加的所有书籍,CD,电影。

    然后我查找特定关键字。 这就是我遇到问题的地方。我在CD,DVD,书类中写了一个getkeyword函数。

    我想要做的是获取关键字,然后查看它们是否匹配,然后将其作为集合返回。

    这里是main()我只会展示一些来保持这个简短 - 我不会告诉你我是如何添加的,因为它运作良好..

    printItemsForKeyword(out, "science fiction");
    printItemsForKeyword(out, "jam bands");
    printItemsForKeyword(out, "xxx");
    
    
    private static void printItemsForKeyword (PrintStream out, String keyword)
    {
        Collection<Item>    items;
    
        out.printf(">>> items for keyword: %s\n\n", keyword);
        items = library.itemsForKeyword(keyword);
        printItems(out, items);
    }
    

    现在这里的库类就是我需要帮助的地方 在itemsForKeyword(String关键字)函数中......

    所以,我想找的第一件事是“科幻小说”

    我认为我需要投放项目,因为项目有CD,DVD,书籍类,我需要返回一个集合???

    现在我正在尝试返回密钥,因为它与返回无关。

    public class Library
    {
    private Set<Item> theCDs = new HashSet<Item>();
    private Set<Item> theDVDs = new HashSet<Item>();
    private Set<Item> theBooks = new HashSet<Item>();
    
    
    public Collection<Item> itemsForKeyword(String keyword)
    {
    
        Item key = new Item();            
        ((CD)key).getKeyword();    // i dont think i am even doing this right
    
        if(key.equals(keyword))
        {
            return key;             // cant return key
           }
    
    
    
        return null;
    }
    

    我确实在下面的每个类中定义了一个getKeywords()函数。

    这是Items类,因为你需要查看它..

    import java.io.PrintStream;
    import java.util.Collection;
    import java.util.*;
    
    
    class Item
    {
    
    private String title;
    
    
    
    public String toString()
    {
    
    String line1 = "title:    " + title + "\n";
    return line1;
    }
    
    
    public void print()
    {
    
    System.out.println(toString());
    
    
    }
    
    
    public Item()
    {
    
    }
    
    public Item(String theTitle)
    {
    
    title = theTitle;
    
    }
    
    public String getTitle()
    {
    return title;
    }
    
    
    
    }
    
    class CD extends Item
    {
    
    private String artist;
    private String [] members;
    private String [] keywords;
    private int number;
    
    
    
    
    
    public CD(String theTitle, String theBand, int Snumber, String... keywords)
    {
        super(theTitle);
        this.artist = theBand;
        this.number = Snumber;
        this.keywords = keywords;
    
    }
    
    
      public void addband(String... member)
    {
        this.members = member;
    
    }
    
    public String getArtist()
    {
    
        return artist;
    
    }
    
    public String [] getMembers()
    {
     return members;   
    }
    
    
    public String [] getKeyword()
    {
    
        return keywords;
    
    }
    
    
    public String toString()
    {
    
    
    
       return  "-Music-" + "\n"
         + "band:     " + artist + "\n" 
         + "# songs:  " + number + "\n" 
         + "members:  " + Arrays.toString(members) 
         + "\n" + super.toString() 
         + "keywords: " + Arrays.toString(keywords) 
         + "\n" + "\n" ;
    
    }
    
    
    public void print()
    {
    
    
        System.out.println(toString());
    
    }
    
      }
    
    
    class DVD extends Item
    {
    
    private String director;
    private String [] cast;
    private int scenes;
    private String [] keywords;
    
    
    public DVD(String theTitle, String theDirector, int nScenes, String... keywords)
    {
        super(theTitle);
        this.director = theDirector;
        this.scenes = nScenes;
        this.keywords = keywords;
    
    }
    
    public void addmoviecast(String... members)
    {
        this.cast = members;
    
    
    }
    
    public String [] getCast()
    {
        return cast;
    
    }
    
    
    
    public String getDirector()
    {
        return director;
    }
    
    public String [] getKeyword()
    {
    
        return keywords;
    
    }
    
    
    
    
     public String toString()
     {
    
        return "-Movie-" + "\n"
         + "director: " + director + "\n"
         + "# scenes: " + scenes + "\n"
         + "cast:     " + Arrays.toString(cast) + "\n"
         + super.toString() 
         + "keywords: " + Arrays.toString(keywords) 
         + "\n" + "\n" ;
    
     }
    
     public void print()
     {
    
      System.out.println(toString());  
    
     }
    
     }
    
    
    class Book extends Item
    {
    
    private String author;
    private int pages;
    private String [] keywords;
    
    
    public Book(String theTitle, String theAuthor, int  nPages, String... keywords)
    {
        super(theTitle);
        this.author = theAuthor;
        this.pages = nPages;
        this.keywords = keywords;
    
    }
    
    
    public String getAuthor()
    {
    
        return author;
    
    }
    
    public String [] getKeyword()
    {
    
        return keywords;
    
    }
    
    
    
    
    public void print()
    {
    
        System.out.println(toString());  
    
    }
    
    
     public String toString()
    {
    
        return "-Book-" + "\n"
         + "Author:   " + author + "\n" 
         + "# pages   " + pages + "\n"
         + super.toString() 
         + "keywords: " + Arrays.toString(keywords) 
         + "\n" + "\n" ;
    
    
    }    
    }
    

    之所以我认为我需要做某种类型的演员是因为我必须在我添加的时候 bandmembers ..

    public void addBandMembers(Item musicCD, String... members)
    {
    
    
        ((CD)musicCD).addband(members);
    
    
    }
    

    那么,我该怎么做才能在项目中找到关键字并返回这些关键字? 是不是更好地直接看集合并做一些类型的演员才能让它返回?我只是难倒..

    谢谢..

2 个答案:

答案 0 :(得分:1)

创建一个索引(SortedMap<String, List<Item>>),将关键字与其代表的项目相关联。将对象添加到库中时,将其映射到索引中的每个关键字,并根据需要添加新关键字。搜索索引以查找对象。

答案 1 :(得分:0)

有点难以理解你想要提出的问题,但我希望以下是你所追求的。在我看来,您主要关注的是使用方法public Collection<Item> itemsForKeyword(String keyword)获取项目集合。

在此方法中,您应该执行以下操作:

  1. 创建一个空集合(HashSet或TreeSet,具体取决于您是否需要对其进行排序)。
  2. 循环穿过CD。对于每个项目,获取其关键字。
  3. 循环关键字。如果您找到传递的equals(或equalsIgnoreCase),请将项目添加到您在1中创建的集合中。
  4. 为DVD和书籍重复2和3。
  5. 返回您在1中创建的集合。
  6. 其他一些事情:

    • 我建议您将getKeyword重命名为getKeywords,因为这就是它返回的内容。
    • 出于此方法的目的,最好在HashSet中使用关键字,这样就可以执行item.getKeyword().containsKey(keyword)而不是3中的循环。如果执行此操作并需要它,则方法不区分大小写,您需要以全部小写或全部大写形式存储关键字,并在步骤0中添加以在搜索之前将传入的关键字转换为正确的大小写。此外,如果您需要在其他地方广泛使用关键字作为数组,这可能不是一种方法。