本周要求写一个程序来读入一系列被保存在txt文件中的正整数,然后输出一个txt文件,其中应该包含一个表格按照升序列出输入的正整数,并指出这些数字出现的次数. 输入文件中的数应该以一个负数结尾.例如,如果你在命令台输入以下命令:
$ java Duplicate dupdata.txt
dupdata.txt这个输入文件中包含以下数据:
3
11
26
3
7
99
105
7
16
99
3
17
2
-1
那么就应该产生一个txt文件,其中内容应该类似:
Value Occurrences
----- -----------
2 1
3 3
7 2
11 1
16 1
17 1
26 1
99 2
105 1
在写这个程序时,你应该用到Java库中的LinkedList结构. 该List中的成员对象包含每个整数的信息以及出现的次数. 当从txt文件中读入一个新的整数时,你应该在这个List中找它.如果这个数字已经存在于List当中,那么就直接增加对应数字出现的次数. 如果List中没有该数字,你需要给List添加一个新数值.注意,再给List添加新值时要确保添加在正确位置. List中的元素必须一直保持升序.
------解决思路----------------------
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new FileReader(new File("src/a.txt")));
BufferedReader br2 = new BufferedReader(new FileReader(new File("src/a.txt")));
List<Integer>list1 = new LinkedList<Integer>();
List<Integer>list2 = new LinkedList<Integer>();
String str = null;
int i;
//第一次读文件,将所有数字去重排序
while(!(str=br.readLine()).equals("-1")){
int a = Integer.parseInt(str);
for(i=0;i<list1.size();i++){
if(list1.get(i)==a) break;
}
if(i==list1.size()) {
list1.add(a);
}
}
Collections.sort(list1);
for(int j=0;j<list1.size();j++){
list2.add(0);
}
//第二次读文件统计次数
while(!(str=br2.readLine()).equals("-1")){
int b = Integer.parseInt(str);
for(i=0;i<list1.size();i++){
if(list1.get(i)==b) break;
}
list2.set(i, list2.get(i)+1);
}
//写文件自己写一下,我这里只做了输出,代码可能复杂,纯属探讨有优化的地方可以指出
for(int k=0;k<list1.size();k++){
System.out.println(list1.get(k)+":"+list2.get(k));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}