(1)实验题目:打开中的lunch.java文件,一次读取其中的一行,令每行形成一个String对象。然后利用java.util.Comparator接口重新定义String对象间的比较方法:将每个String中的小写字母转为大写后再进行比较。使用该比较法对这些String进行排序,按从大到小的顺序存入一个LinkedList。最后将LinkedList中的String按存入的相反顺序输出到另一个文件inverse.txt中。
(2)实验思路:
涉及到了文件的输入和输出,使用try catch处理异常。
因为要按行处理,首先使用BufferedReader读入文件。使用readLine方法,一次读入一行转为String对象,存入ArrayList容器中。
然后进行排序,这里要实现Comparator接口。compareTo方法里先用toUpperCase方法将String所有字母转化为大写字母,再比较。注意从大到小排序。
使用addAll方法将ArrayList容器中的内容加入LinkedList容器。将容器中的内容倒序输出到指定文件中,使用DataOutputStream写入文件,使用writeBytes方法进行文件写入。为了方便观察实验结果和再次读取,输出时加入换行符。
(3)实验源码
package 实验;
import java.io.*;
import java.util.*;
class cmp implements Comparator<String>{
@Override
public int compare(String s1,String s2) { //实现从大到小排序
s1=s1.toUpperCase();
s2=s2.toUpperCase();
return s2.compareTo(s1);
}
}
public class Text {
public static void main(String[] args) {
try {
String filename = "G:\\code\\java\\实验\\Lunch.java";
BufferedReader br = new BufferedReader(new FileReader(filename));
ArrayList<String> sz = new ArrayList<String>();
String s;
while( (s = br.readLine())!=null )//按行读取存入字符串数组
{
sz.add(s);
}
br.close();
Collections.sort(sz,new cmp()); //按自定义排序规则进行排序
LinkedList<String> list = new LinkedList<String>();
list.addAll(sz); //存入LinkedList
File f = new File("inverse.txt");
if(!f.exists()) f.createNewFile(); //创建文件
DataOutputStream ds = new DataOutputStream(new FileOutputStream(f));
for(int i=list.size()-1;i>=0;i--) //按存入的相反顺序读出
{
ds.writeBytes(list.get(i)+'\n');
}
ds.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
(4)实验结果:
先从大到小排序,然后逆序输出,最终每一行在文件里按从小到大排列。
(5)实验心得:
此题涉及两个个知识点:文件输入输出和排序。
输入使用BufferedReader的readLine方法,一次读入一行。 输出选用DataInputStream而不是PrintWriter,并且对于将字符写入文件应当使用writeBytes而不是writeChar(后者更容易出错)。
排序有两种方法,Comparable和Comparator都是用来实现集合中元素的比较、排序的。Comparable是在集合内部定义的方法实现的排序,位于java.lang下。
Comparator是在集合外部实现的排序,位于java.util下。在本题中要对String数组采用题目要求的排序方式,应自定义比较器,使用Collections.sort(sz,new cmp()) 传入指定Comparator进行排序。如果不传入自定义Comparator,将默认使用String实现的Comparable接口从小到大排序。
一个细节:如果在Eclipse项目中直接用new BufferedReader(new FileReader("Lunch.java"))这样不带路径直接用文件名访问文件,Lunch.java应放在和src平级的目录下而不是和代码文件放在一个目录下。不带路径创建的inverse.txt也出现在和src平级的文件夹下。