这个程序该怎么写呢?
请写一个程序找出附件中文件重复的行
输出:
输出一个文本文件,给出哪些行是重复的,第一次出现的行号,格式如下
行号 此行的文本内容
并给出此程序的运行时间
用JAVA写
------解决方案--------------------
问题的关键不是读取行,而是比较。
如果比读一行的,就和前面所有行比较的话,那么越到后来就越慢,而且这样的操作并不必要。
我们可以用一个简单的查找来做,前提也是读取行,并且去行的头一个字母作为Key值,
class MyLineString{
private String ls;
private int lnum;
public MyLineString(String ls, int lnum){
this.ls = ls;
this.lnum = lnum;
}
public String getLs(){
return ls;
}
public int getLnum(){
return lnum;
}
public boolean equals(Object obj){
if(obj == null || !(obj instanceof MyLineString)){
return false;
}
MyLineString lstr = (MyLineString)obj;
return ls.equals(lstr.getLs());
}
public int hashCode(){
return ls.hashCode();
}
public String toString(){
return "重复行行号:" + lnum + ",内容:" + ls;
}
}
MyLineString mls = null;
需要定义一个行号计数器
index++;
HashMap<String, List<MyLineString>> map = new HashMap<String, List<MyLineString>>();
String lineStr = br.readLine();
String key = null;
if(lineStr.length > 0){
key = lineStr.substring(0,1);
if(map.containKey(key)){
List<MyLineString> list = map.get(key);
mls = new MyLineString(lineStr,index);
if(!list.contain(mls)){
list.add(mls);
} else {
System.out.println(list.get(list.indexOf(mls)));
}
} else {
mls = new MyLineString(lineStr,index);
List<MyLineString> list = new LinkedList<MyLineString>();
map.put(key, list);
}
}
就像上面的实现