Несовместимые типы для каждого цикла - PullRequest
0 голосов
/ 29 марта 2012

Я работаю над проектом, который создает виртуальную базу данных для фильмов.У меня есть два класса: MovieEntry (для отдельной записи фильма) и MovieDatabase (больший класс, который содержит базу данных и допускает добавления и т. Д.) Я получаю несколько ошибок, первая из которых заключается в том, что в методе searchTitleговорит, что база данных несовместимого типа.Может кто-нибудь сказать мне, как сделать эти петли для каждого?Я прочитал книгу и подумал, что ArrayList должен был туда попасть, но, видимо, нет.

**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>();

    }

}**

Ответы [ 5 ]

2 голосов
/ 29 марта 2012

Тип переменной foreach (String, в случае цикла в вашем методе searchTitle) должен быть совместим с параметром типа (MovieEntry) параметризованного типа (ArrayList<MovieEntry>). Это явно не тот случай. Будет работать следующий цикл foreach:

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

Пожалуйста, примите во внимание соглашение об использовании строчных имен для полей, т. Е. Назовите ваш ArrayList<MovieEntry> с именем, таким как database вместо Database.

1 голос
/ 29 марта 2012

Ну

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

работает только в том случае, если коллекция содержит элементы типа Type.Практически в вашем случае это означает:

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

будет работать, потому что Database - это ArrayList, содержащий тип MovieDatabase:

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

, если вы хотите зациклить заголовки в базе данных, вы должны предоставитьметод, который возвращает список строк заголовков, например

public ArrayList<String> getTitles() {...}
....
for (String title : Database.getTitles()) {...}
0 голосов
/ 29 марта 2012

ваш for-each цикл должен выглядеть примерно так (это всего лишь пример, так что вам придется адаптировать его для своего)

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

ArrayList - это правильная вещь для циклано в вашем случае вы пытаетесь получить Strings, когда ваш список не содержит Strings, тогда вы вызываете методы для тех Strings, которые String не поддерживает.Вы должны использовать правильный тип для каждого списка.

0 голосов
/ 29 марта 2012

изменить

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

на

private ArrayList<MovieEntry> Database;;
public MovieDatabase(){
   Database = new ArrayList<MovieDatabase>(0);
}
0 голосов
/ 29 марта 2012

Ваше свойство базы данных (должно быть базой данных в нижнем регистре), имеет тип:

ArrayList<MovieDatabase>

И вы пытаетесь перебрать его, используя строку в качестве типа элемента.

Ваш foreach должен быть:

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