0

我正在开发一个为电影创建虚拟数据库的项目。我有两个类:MovieEntry(用于单个电影条目)和 MovieDatabase(包含数据库并允许添加等的较大类)我遇到了一些错误,其中第一个是在 searchTitle 方法中说数据库是不兼容的类型。谁能告诉我如何执行这些 for-each 循环?我读了这本书,我认为 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>();

    }

}**
4

5 回答 5

2

foreach 变量的类型(String,在您的searchTitle方法中的循环的情况下)必须与MovieEntry参数化类型( )的类型参数( )兼容ArrayList<MovieEntry>。显然不是这样。以下 foreach 循环将起作用:

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

请考虑遵循为字段使用小写名称的约定,即ArrayList<MovieEntry>使用诸如database代替的名称调用您的名称Database

于 2012-03-29T14:05:27.313 回答
1

出色地

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()) {...}
于 2012-03-29T14:06:09.983 回答
0

您的 Database 属性(应该是 database,小写)的类型为:

ArrayList<MovieDatabase>

您正在尝试使用 String 作为元素类型对其进行迭代。

你的 foreach 应该是:

for(MovieDatabase element: Database){
....
}
于 2012-03-29T14:03:26.533 回答
0

你的for-each循环应该是这样的(这只是一个例子,所以你必须适应你的)

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

anArrayList是一个有效的循环,但在你的情况下,你试图Strings在你的列表不成立时得到,Strings然后你正在调用那些StringsString支持的方法。您必须为每个列表使用正确的类型。

于 2012-03-29T14:03:28.293 回答
0

改变

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);
}
于 2012-03-29T14:03:46.577 回答