通过 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()
.
希望对您有所帮助。如果您还有其他问题,请告诉我。祝你好运。
我是一名新 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()
.
希望对您有所帮助。如果您还有其他问题,请告诉我。祝你好运。