2010-02-19 6 views
2

J'ai une collection j'ai ajouté des informations CD, DVD, livre dans hashsets. Chacun a un mot clé et je voudrais faire une recherche pour un mot clé et retourner le livre spécifique, CD, DVD ... Heres la sortie pour vous donner une idée ..trouver un mot-clé dans une collection et le retourner

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

J'ai 3 Des classes.

  1. Main()
  2. Library - c'est là que je fais tout l'ajout de CD, DVD, livres. lookups, etc
  3. Articles de classe (classe CD, classe DvD, classe livre) en utilisant l'héritage ..

en main() J'envoie des informations à la classe de la bibliothèque pour ajouter aux ensembles. puis j'imprime tous les livres, cd, films qui viennent d'être ajoutés.

puis je recherche un mot-clé spécifique. Et c'est là que j'ai des problèmes. J'ai écrit une fonction getkeyword en CD, DVD, classe de livre.

Ce que je veux faire est d'obtenir le mot-clé, puis voir si elles correspondent et ensuite le retourner en tant que collection.

ici est le principal() Je ne montrer quelques-uns pour garder ce court - je ne vais pas vous montrer comment je suis d'ajouter, car il fonctionne bien ..

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

maintenant ici dans la classe de la bibliothèque est où je besoin d'aide dans la itemsForKeyword fonction (mot-clé String) ...

donc, la première chose que je suis en train de trouver est « science Fiction »

Je pense que je dois jeter un objet puisque le point a la CD, DVD, classes de livres et je dois retourner une collection ion???

maintenant j'essaie de retourner la clé et il ne va pas car son incompatibilité avec le retour.

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

J'ai défini une fonction getKeywords() dans chacune des classes ci-dessous.

Voici la classe Articles puisque vous aurez besoin de regarder par-dessus ..

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


}  
} 

la raison pour laquelle je pense que je dois faire sometype de casting est parce que je devais quand j'ajouté .. bandmembers Alors, que puis-je faire pour trouver un mot-clé dans les articles et les renvoyer? serait-il préférable de regarder directement les ensembles et faire un certain type de distribution pour le faire revenir? im juste déconcerté ..

Merci ..

+0

tout d'abord, placez les mots-clés dans la classe de base Item à laquelle elle appartient. – Jherico

+0

Juste un conseil: s'il vous plaît prêter attention à la mise en forme du code. Il y a beaucoup d'espaces inutiles et l'indentation est mauvaise. Cela peut dérouter et ennuyer beaucoup de lecteurs et les amener à se déplacer le long de votre question. Si vous utilisez un EDI comme Eclipse, faire simplement Ctrl + Maj + F vous aidera beaucoup. – BalusC

+0

Je suis d'accord .. cependant, j'utilise bluej .. il est difficile d'indenter –

Répondre

0

Il est un peu difficile à suivre ce que vous essayez de demander, mais je l'espère ce qui suit est ce que vous êtes après. Il me semble que vous êtes principalement concerné par l'obtention d'une collection d'objets, que vous voulez faire en utilisant la méthode public Collection<Item> itemsForKeyword(String keyword).

Dans cette méthode, vous devez faire ce qui suit:

  1. Créer une collection vide (soit un HashSet ou TreeSet selon que vous en avez besoin triée).
  2. Parcourez les CD. Pour chaque article, obtenez ses mots-clés.
  3. Parcourez les mots clés en boucle. Si vous en trouvez un qui est equals (ou equalsIgnoreCase) celui ajouté, ajoutez l'Article à la Collection que vous avez créée en 1.
  4. Répétez les étapes 2 et 3 pour les DVD et les Livres.
  5. Retour de la collection créée à 1.

Quelques autres:

  • Je vous suggère de renommer getKeyword à getKeywords, puisque c'est ce qu'il est de retour.
  • Pour les besoins de cette méthode, il vaudrait mieux avoir des mots-clés dans un HashSet afin de pouvoir faire item.getKeyword().containsKey(keyword) au lieu de la boucle 3. Si vous faites cela et que vous en avez besoin pour que la méthode ne soit pas sensible à la casse, pour stocker les mots-clés en minuscules ou en majuscules, et ajouter une étape 0 pour convertir le mot-clé transmis en un cas approprié avant de lancer une recherche. En outre, cela peut ne pas être la voie à suivre si vous avez besoin d'utiliser intensivement des mots-clés en tant que tableau ailleurs.
+0

vous avez dit "votre mieux avoir des mots-clés dans un hashset donc vous pouvez faire:" item.getKeyword(). ContainsKey (mot-clé) ce qui est défini comme ? –

+0

Une instance de votre classe Item. – lins314159

+0

donc, quelque chose comme ça .. Item obj = new item(); obj.getKeyword(). containsKey (mot-clé); ?? –

1

Créez un index (SortedMap<String, List<Item>>) en associant les mots clés aux éléments qu'ils représentent. Lorsqu'un objet est ajouté à la bibliothèque, associez-le à chacun de ses mots-clés dans l'index, en ajoutant de nouveaux mots-clés si nécessaire. Recherchez l'index pour trouver les objets.

Questions connexes