2015-04-01 46 views
0

我是一名新的Java程序员,我正在开发一个项目,要求我阅读包含电影评论的文本文件。通过Arraylist搜索并排序

一旦我阅读了文件,我被要求搜索和排序电影阵列,并返回每部电影的评论总数以及每部电影的平均评分。

我当前停留的部分正在迭代Array列表。

我正在使用一个内部和外部for循环,我似乎得到一个无限循环。

我会欣赏第二套眼睛。我一直在盯着这个项目几天,并开始不看错误。

下面是代码:

import java.io.*; 
import java.util.*; 
import java.lang.*; 

public class MovieReviewApp { 

public static void main(String[] args) 
{ 

    String strline = ""; 
    String[] result = null; 
    final String delimit = "\\s+\\|\\s+"; 
    String title =""; 
    //int rating = (Integer.valueOf(- 1)); 

    ArrayList<MovieReview> movies = new ArrayList<MovieReview>(); 
    //ArrayList<String> titles = new ArrayList<String>(); 
    //ArrayList<Integer> ratings = new ArrayList<Integer>(); 
    //HashMap<String, Integer> hm = new HashMap<String, Integer>(); 
    //ListMultimap<String, Integer> hm = ArrayListMultimap.create(); 

    try 
    { 

     BufferedReader f = new BufferedReader(new FileReader("/Users/deborahjaffe/Desktop/Java/midterm/movieReviewData.txt")); 

     while(true) 
     { 
      strline = f.readLine(); // reads line by line of text file 

      if(strline == null) 
      { 
       break; 
      } 

      result = strline.split(delimit, 2); //creates two strings 

      //hm.put(result[0], new Integer [] {Integer.valueOf(result[1])}); 
      //hm.put(result[0], Integer.valueOf(result[1])); 

      // titles.add(result[0]); 
      //ratings.add(Integer.valueOf(result[1])); 

      MovieReview m = new MovieReview(result[0]); 
      movies.add(m); 
      MovieReview m2 = new MovieReview(); 

      int rating = Integer.valueOf(result[1]); 
      int sz = movies.size(); 


      for (int i = 0; i < sz; i++) 
      { 
       for (int j = 0; j < sz; j++) 
       { 
        m2 = movies.get(i); 

        if (movies.contains(m2)) 
        { 
         m2.addRating(rating); 
        } 

        else 
        { 
         movies.add(m2); 
         m2.addRating(rating); 
        } 
       } 
      } 

      movies.toString(); 

      //Collections.sort(movies); 

     } //end while 

     f.close(); 

     //Set<String> keys = hm.keySet(); 
     //Collection<Integer> values = hm.values(); 

    } //end of try 

    catch(FileNotFoundException e) 
    { 
     System.out.println("Error: File not found"); 
    } 
    catch(IOException e) 
    { 
     System.out.println("Error opening a file."); 
    } 

} // end main 

} // end class 
+0

我在打电话,所以代码很难阅读,但你有一段时间了。那是一个故意的无限循环吗? – ghostbust555 2015-04-01 19:20:48

+0

它看起来不像一个无限循环,但你确实设置了一个指数循环结构。在1,000部电影中,您将添加一百万条评论,并且只会变得更糟。您可能想要尝试一部分电影(如5-10),以便您可以找到代码中的所有错误。 – JimW 2015-04-01 19:43:33

+0

@DeborahJaffe我建议你快速查看一下我的答案,特别是关于使用扫描器而不是BufferedReader来获得更高效率和更多功能的部分。关于你在Sujan Reedy A的回答中提到的问题,你可以请扩展一下吗?我知道它没有被正确地读取,但是也许输入与代码的输出对于找出错误是更有用的。 – Ungeheuer 2015-04-03 17:40:28

回答

1

先读文件,然后遍历列表或映射为搜索,排序等。在上述代码中,通过列表迭代之前关闭while循环。

+0

我以前曾尝试过这种方法,但遇到了我的评分数组列表问题,因此无法在while循环之外正确读取。有没有办法来解决这个问题? – 2015-04-01 20:39:51

0

如果要遍历ArrayList,可以使用增强型for-loop来遍历它。注意:在增强型for-loop中,不能ArrayList进行更改,因为增强型for-loop使ArrayList基本(并且暂时)为只读。这将适用于迭代拉取值,但不适用于添加值。因为你正在改变ArrayList这不起作用,但我只是认为你应该知道它,如果你还没有。增强型for-loop这样工作,我会把单独的部分放在波形括号中,
for({Object Type of ArrayList} {Dummy Value} : {name of ArrayList}),所以它看起来像这样:for(MovieReview x: movies)

关于这个内部嵌套for-loop

for (int i = 0; i < sz; i++) 
     { 
      for (int j = 0; j < sz; j++) 
      { 
       m2 = movies.get(i); 

       if (movies.contains(m2)) 
       { 
        m2.addRating(rating); 
       } 

       else 
       { 
        movies.add(m2); 
        m2.addRating(rating); 
       } 
      } 
     } 

为什么你的内部?变量j从来没有用于任何东西,所以for-loop似乎没用。除非你在内循环的顶部犯了一个错误,并且意味着有m2 = movies.get(j);,但这似乎不太可能。

关于无限循环,您编写for-loops的方式,您不应该得到无限循环,因为它们都增加到可达的某个值。您的while-loop似乎无限运行,但我注意到,如果strline指向空值,您将有break。我认为这是保证发生在文件的末尾,但我建议你让你的while-loop的条件为while(scannerName.hasNext())。这将使您的while-loop最终终止,无需额外的代码加上有Scanner而不是BufferedReader会稍微更有效率,并仍然做BufferedReader可以做的所有事情和更多,如该方法hasNext()

我希望这有助于。如果您还有其他问题,请告诉我。祝你好运。