通过 Arraylist 搜索和排序

Searching and sorting through an Arraylist

我是一名新 Java 程序员,我正在从事一个需要我阅读包含电影评论的文本文件的项目。

阅读文件后,系统要求我搜索电影数组并return对每部电影的评论总数以及每部电影的平均评分进行排序。

我目前卡住的部分是遍历数组列表。

我正在使用内部和外部 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

先读取文件,然后遍历列表或映射以进行搜索、排序等。在上面的代码中,在遍历列表之前关闭 while 循环。

如果您想遍历 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 指向 null,您有一个 break。我假设这肯定会发生在文件末尾,但我建议您将 while-loop 的条件设置为 while(scannerName.hasNext())。这将允许您的 while-loop 最终终止而无需额外的代码加上 Scanner 而不是 BufferedReader 会稍微更有效率并且仍然可以完成 BufferedReader 可以做的所有事情还有更多,比如那个方法 hasNext().

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