搜索和排序Arraylist

时间:2015-04-01 18:14:24

标签: java arraylist bufferedreader

我是一名新的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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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似乎无限运行,但如果break指向null,我会注意到您有strline。我认为这肯定发生在文件的末尾,但我建议您为while-loop while(scannerName.hasNext())做出条件。这样,您的while-loop最终可以在没有额外代码的情况下终止,加上Scanner代替BufferedReader会稍微提高效率,并且仍会执行BufferedReader可以执行的所有操作还有更多,就像那种方法hasNext()

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