найти ключевое слово в коллекции и вернуть его - PullRequest
2 голосов
/ 19 февраля 2010

У меня есть коллекция, я добавил 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, класс книги) с использованием наследования ..

в main () я посылаю информацию в библиотечный класс для добавления в наборы. затем я распечатываю все книги, CD, фильмы, которые только что добавили.

тогда я делаю поиск по конкретному ключевому слову. И вот тут у меня проблемы. я написал функцию getkeyword на CD, DVD, в классе книги.

Что я хочу сделать, это получить ключевое слово, а затем посмотреть, совпадают ли они, а затем вернуть его как коллекцию.

здесь 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" ;


}    
}

причина, по которой я думаю, что мне нужно сделать какой-то тип приведения, заключается в том, что мне пришлось, когда я добавил Участники группы ..

public void addBandMembers(Item musicCD, String... members)
{


    ((CD)musicCD).addband(members);


}

Итак, что я могу сделать, чтобы найти ключевое слово в элементах и ​​вернуть их? было бы лучше взглянуть прямо на наборы и сделать какой-то тип приведения, чтобы вернуть его? я просто в тупик ..

Спасибо ..

Ответы [ 2 ]

1 голос
/ 19 февраля 2010

Создание индекса (SortedMap<String, List<Item>>), связывающего ключевые слова с элементами, которые они представляют. Когда объект добавлен в библиотеку, сопоставьте его с каждым из его ключевых слов в индексе, добавляя новые ключевые слова по мере необходимости. Поиск по индексу, чтобы найти объекты.

0 голосов
/ 19 февраля 2010

Немного трудно следовать тому, что вы пытаетесь спросить, но я надеюсь, что вам нужно следующее. Мне кажется, что вы в основном заинтересованы в получении Коллекции предметов, которую вы хотите сделать, используя метод public Collection<Item> itemsForKeyword(String keyword).

В этом методе вы должны сделать следующее:

  1. Создайте пустую коллекцию (HashSet или TreeSet в зависимости от того, нужна ли она для сортировки).
  2. Цикл по CD. Для каждого элемента получите его ключевые слова.
  3. Цикл по ключевым словам. Если вы найдете тот, который equals (или equalsIgnoreCase) переданный, добавьте Предмет в коллекцию, которую вы создали в 1.
  4. Повторите 2 и 3 для дисков DVD и книг.
  5. Вернуть коллекцию, созданную вами в 1.

Пара других вещей:

  • Я бы предложил переименовать getKeyword в getKeywords, поскольку это то, что он возвращает.
  • Для целей этого метода, вам было бы лучше иметь ключевые слова в HashSet, чтобы вы могли делать item.getKeyword().containsKey(keyword) вместо зацикливания в 3. Если вы делаете это и нуждаетесь в этом методе, чтобы не учитывать регистр, вы необходимо будет хранить ключевые слова в нижнем или верхнем регистре и добавлять на шаге 0, чтобы преобразовать переданное ключевое слово в правильный регистр перед поиском. Кроме того, это может не подходить, если вам нужно широко использовать ключевые слова в качестве массива в других местах.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...