2015-04-01 47 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()

我希望這有助於。如果您還有其他問題,請告訴我。祝你好運。