2015-04-01 3 views
0

Я новый программист на Java, и я работаю над проектом, который требует, чтобы я прочитал текстовый файл с обзорами фильмов.Поиск и сортировка по Arraylist

После того, как я прочитал файл, меня попросили найти и отсортировать массив фильмов и вернуть общее количество отзывов для каждого фильма, а также средний показатель для каждого фильма.

Часть, в которую я сейчас застреваю, выполняет итерацию через список массивов.

Я использую внутренний и внешний цикл, и я, кажется, получаю бесконечный цикл.

Буду признателен за второй комплект глаз. Я смотрю на этот проект уже несколько дней и не вижу ошибок.

Вот код:

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

+0

Это не похоже на бесконечный цикл, но вы создали экспоненциальную структуру цикла.В 1000 фильмов вы добавите миллион отзывов, и это только ухудшится. Возможно, вам захочется попробовать подмножество (например, 5-10) фильмов, чтобы вы могли найти все ошибки в вашем коде. – JimW

+0

@DeborahJaffe Я предлагаю вам быстро взглянуть на мой ответ, особенно на то, что у вас есть сканер вместо BufferedReader для лучшей эффективности и универсальности. Что касается вашей проблемы, о которой вы говорили в ответе Суджан Риди А, можете ли вы, пожалуйста, расширить ее? Я понимаю, что он не читается должным образом, но, возможно, ввод и вывод из кода были бы более полезными при определении того, что не так. – Ungeheuer

ответ

1

Прочитайте файл первой, а затем перебирать список или карту для поиска, сортировки и т.д. В приведенном выше коде, закройте время цикла, прежде чем итерация по списку.

+0

Я пробовал это ранее, но имел проблемы с моим списком массивов рейтингов, которые не читаются за пределами цикла while. Есть ли способ исправить это? –

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, если strline указывает на null. Я предполагаю, что это гарантировано произойдет в конце файла, но я бы предположил, что вы делаете условие для своего while-loop be while(scannerName.hasNext()). Это позволит вашему while-loop в конечном итоге завершить работу без дополнительного кода плюс наличие Scanner вместо BufferedReader будет немного более эффективным и сделать все, что может сделать BufferedReader, и многое другое, например, этот метод hasNext().

Надеюсь, это помогло. Если у вас есть другие вопросы, дайте мне знать. Удачи.

Смежные вопросы