【问题标题】:Searching and sorting through an Arraylist通过 Arraylist 搜索和排序
【发布时间】:2015-04-01 18:14:23
【问题描述】:

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

读取文件后,系统会要求我搜索和排序电影数组,然后返回每部电影的评论总数以及每部电影的平均评分。

我目前坚持的部分是遍历数组列表。

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

【问题讨论】:

  • 我在打电话,所以代码很难阅读,但你确实有。那不是故意的无限循环吗?
  • 它看起来不像无限循环,但您确实设置了指数循环结构。在 1,000 部电影中,您将添加一百万条评论,而且只会变得更糟。您可能想尝试电影的一个子集(如 5-10 部),以便找出代码中的所有错误。
  • @DeborahJaffe 我建议您快速查看我的答案,尤其是关于使用 Scanner 而不是 BufferedReader 以获得更高效率和更多功能的部分。关于您在 Sujan Reedy A 的回答中提到的问题,您能详细说明一下吗?我知道它没有被正确阅读,但也许代码的输入与输出在找出问题所在方面会更有用。

标签: java arraylist bufferedreader


【解决方案1】:

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

【讨论】:

  • 我之前尝试过这个,但我的评级数组列表出现问题,无法在 while 循环之外正确读取。有没有办法解决这个问题?
【解决方案2】:

如果您想遍历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 可以做的所有事情以及更多,就像那个方法@ 987654346@.

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2023-03-30
    • 1970-01-01
    • 2015-09-02
    相关资源
    最近更新 更多