日期:2014-05-20  浏览次数:20619 次

这个程序该怎么写呢?
请写一个程序找出附件中文件重复的行
输出:
  输出一个文本文件,给出哪些行是重复的,第一次出现的行号,格式如下
  行号 此行的文本内容
  并给出此程序的运行时间
用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);
}
}

就像上面的实现