2012-03-29 23 views
0

Ich arbeite an einem Projekt, das eine virtuelle Datenbank für Filme erstellt. Ich habe zwei Klassen: MovieEntry (für den einzelnen Film-Eintrag) und MovieDatabase (die größere Klasse, die die Datenbank enthält und Ergänzungen erlaubt, etc.) Ich bekomme ein paar Fehler, die erste davon ist die in der searchTitle-Methode sagt, dass die Datenbank von einem inkompatiblen Typ ist. Kann mir jemand sagen, wie man das für jede Schleife macht? Ich las das Buch und dachte, die ArrayList sollte dorthin gehen, aber anscheinend nicht.Für jede Schleife Inkompatible Typen

**import java.util.ArrayList; 
import java.util.Scanner; 
import java.io.*; 
public class MovieDatabase 
{ 
    private ArrayList<MovieEntry> Database = new ArrayList<MovieEntry>(); 
    public MovieDatabase(){ 
     ArrayList<MovieDatabase> Database = new ArrayList<MovieDatabase>(0); 
    } 

    public int countTitles() throws IOException{ 
    Scanner fileScan; 
    fileScan = new Scanner (new File("movies.txt")); 
    int count = 0; 
    String movieCount; 
    while(fileScan.hasNext()){ 
     movieCount = fileScan.nextLine(); 
     count++; 
    } 
    return count; 
} 

    public void addMovie(MovieEntry m){ 
     Database.add(m); 
    } 

    public ArrayList<MovieEntry> searchTitle(String substring){ 
     for (String title : Database) 
      System.out.println(title); 
      return null; 
    } 

    public ArrayList<MovieEntry> searchGenre(String substring){ 
     for (String genre : Database) 
      System.out.println(genre); 
      return null; 
    } 

    public ArrayList<MovieEntry> searchDirector (String str){ 
     for (String director : Database) 
      System.out.println(director); 
      return null; 
    } 

    public ArrayList<MovieEntry> searchYear (int yr){ 
     ArrayList <String> yearMatches = new ArrayList<String>(); 
     for (String s : Database) 
     s.getYear(); 
     if(yearMatches.contains(y) == false){ 
      yearMatches.add(y); 
     } 
     return yearMatches; 
    } 

    public ArrayList<MovieEntry> searchYear(int from, int to){ 
     ArrayList <String> Matches = new ArrayList<String>(); 
     for(Student s : movies); 
      Matches.add(); 
     return Matches; 
    } 

    public void readMovieData(String movies){ 
     String info; 
     try{ 
      Scanner fileReader = new Scanner(new File(movies)); 
      Scanner lineReader; 

      while(fileReader.hasNext()){ 
       info = fileReader.nextLine(); 

       lineReader = new Scanner(info); 
       lineReader.useDelimiter(":"); 

       String title = lineReader.next(); 
       String director = lineReader.next(); 
       String genre = lineReader.next(); 
       int year = lineReader.nextInt(); 
      } 

     }catch(FileNotFoundException error){ 
      System.out.println("File not found."); 

     }catch(IOException error){ 
      System.out.println("Oops! Something went wrong."); 
     } 
    } 



public int countGenres(){ 
    String g; 
    ArrayList <String> gList = new ArrayList<String>(); 
    for(Student s : movies){ 
     String g = s.getGenre(); 
     if(gList.contains(g) == false){ 
     gList.add(g); 
     } 
     return gList.size(); 
    } 
    } 
    public int countDirectors(){ 
    ArrayList <String> dList = new ArrayList<String>(); 
    for(Student s : movies){ 
     String d = s.getDirector(); 
     if(dList.contains(d) == false){ 
      dList.add(d); 
     } 
     return dList.size(); 
    } 

    } 

    public String listGenres(){ 
     ArrayList <String> genreList = new ArrayList<String>(); 

    } 

}** 
+0

Können Sie die Erklärung von 'Filme' hinzufügen. – hmjd

Antwort

0

Ihre Datenbank-Eigenschaft (sollte Datenbank, klein geschrieben werden), ist vom Typ:

ArrayList<MovieDatabase> 

Und Sie versuchen, darüber iterieren einen String als Elementtyp verwendet wird.

sollte Ihr foreach sein:

for(MovieDatabase element: Database){ 
.... 
} 
0

Ihre for-each Schleife soll wie folgt aussehen (dies ist nur ein Beispiel, so dass Sie es für Ihre anpassen werden müssen)

ArrayList<MovieEntry> list = new ArrayList<MovieEntry>(); 
... 
for(MovieEntry m : list) { 
    ... 
} 

ein ArrayList ist eine gültige Sache zu durchlaufen, aber in Ihrem Fall versuchen Sie, Strings zu bekommen, wenn Ihre Liste nicht Strings hält, dann rufen Sie Methoden auf denen Strings, die String unterstützt nicht. Sie müssen den richtigen Typ für jede Liste verwenden.

0

Änderung

private ArrayList<MovieEntry> Database = new ArrayList<MovieEntry>(); 
public MovieDatabase(){ 
    ArrayList<MovieDatabase> Database = new ArrayList<MovieDatabase>(0); 
} 

zu

private ArrayList<MovieEntry> Database;; 
public MovieDatabase(){ 
    Database = new ArrayList<MovieDatabase>(0); 
} 
2

Der Typ der foreach Variable (String im Falle der Schleife im searchTitle Methode) muss mit dem Typ-Parameter (MovieEntry) kompatibel des parametrierten Typs (ArrayList<MovieEntry>). Dies ist eindeutig nicht der Fall. Die folgende foreach-Schleife funktionieren würde:

for (MovieEntry title : Database) { 
    System.out.println(title); 
} 

Bitte beachten Sie, nach der Konvention der Verwendung von Kleinbuchstaben Namen für die Felder, das heißt rufen Sie Ihren ArrayList<MovieEntry> mit einem Namen wie database statt Database.

0

Gut

for (Type obj : Collection) {...} 

funktioniert nur, wenn die Sammlung Elemente vom Typ Typ hält. Diese praktisch in Ihrem Fall bedeutet:

for (MovieDatabase database : Database) {...} 

funktionieren wird, weil Datenbank Arraylist ist die Art MovieDatabase halten:

ArrayList<MovieDatabase> Database= new ArrayList<MovieDatabase>(); 

, wenn Sie wollen Schleife über Titel in der Datenbank Sie haben ein Verfahren zu schaffen, die zurück gibt die Liste der Strings der Titel, zum Beispiel

public ArrayList<String> getTitles() {...} 
.... 
for (String title : Database.getTitles()) {...}