这个程序该怎么写呢? 请写一个程序找出附件中文件重复的行输出: 输出一个文本文件,给出哪些行是重复的,第一次出现的行号,格式如下 行号 此行的文本内容 并给出此程序的运行时间用JAVA写 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如何读取文件内容:http://blog.csdn.net/YidingHe/archive/2008/12/27/3622915.aspx import java.io.*;import java.util.*;public class T { public static void main(String[] args) throws Exception{ long start=System.nanoTime(); BufferedReader br=new BufferedReader(new FileReader("D:\\text.txt")); String line=""; int index=1; StringBuilder sb=new StringBuilder(); HashMap<String,Integer> map=new HashMap<String,Integer>(); while((line=br.readLine())!=null){ if(map.containsKey(line)) sb.append(map.get(line)+" "+line+"\r\n"); else map.put(line, index); index++; } br.close(); FileWriter fr=new FileWriter("D:\\result.txt"); fr.write(sb+""); fr.close(); long end=System.nanoTime(); System.out.println("运行时间:"+(end-start)+" ns"); }} 问题的关键不是读取行,而是比较。如果比读一行的,就和前面所有行比较的话,那么越到后来就越慢,而且这样的操作并不必要。我们可以用一个简单的查找来做,前提也是读取行,并且去行的头一个字母作为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); }}就像上面的实现 上面的代码是手写的,有错误的话,在IDE里面改一下就行了,只是给你写了比较的逻辑和对象的定义,上面的计较应该是可以节约时间和比较次数的。 import java.io.*;import java.util.*;public class T { public static void main(String[] args) throws Exception{ long start=System.nanoTime(); LineNumberReader reader=new LineNumberReader(new FileReader("D:\\test.txt")); String line=""; StringBuilder sb=new StringBuilder(); HashMap<Integer,String> map=new HashMap<Integer,String>(); map.clear(); while((line=reader.readLine())!=null){ if(!map.containsValue(line)){ map.put(reader.getLineNumber(),line); sb.append(reader.getLineNumber()+":"+line+"\r\n"); } } reader.close(); long end=System.nanoTime(); FileWriter fr=new FileWriter("D:\\result.txt"); fr.write(sb+""); String time="运行时间: "+(end-start)+" ns"; fr.write(time); fr.flush(); fr.close(); }}大家试试这个啊,应该没有问题的 import java.io.*; import java.util.*; public class T { public static void main(String[] args) throws Exception{ long start=System.nanoTime(); LineNumberReader reader=new LineNumberReader(new FileReader("D:\\test.txt")); String line=""; StringBuilder sb=new StringBuilder(); HashMap <Integer,String> map=new HashMap <Integer,String>(); map.clear(); while((line=reader.readLine())!=null){ if(!map.containsValue(line)){ map.put(reader.getLineNumber(),line); sb.append(reader.getLineNumber()+":"+line+"\r\n"); } } reader.close(); long end=System.nanoTime(); FileWriter fr=new FileWriter("D:\\result.txt"); fr.write(sb+""); String time="运行时间: "+(end-start)+" ns"; fr.write(time); fr.flush(); fr.close(); } } 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); }} 这么看起来 才好看! java swing中的问题 急!!! JWindow 问题 在java中如何自定义一个日期域,格式为:[ - - ],请赐教. 求一算法,先谢了! 如何添加 package包? 菜鸟请教大家! 一个easy的问题! 菜鸟盼望雷锋叔叔和雷锋阿姨的出现,谢谢了 byte[1024] 这个有多大 Java 实现录音功能 第一次能录音,第二次录音就不行,抛异常 关于List<String>和List<List<String>>的用法 jframe布局的问题
http://blog.csdn.net/YidingHe/archive/2008/12/27/3622915.aspx
import java.util.*;
public class T { public static void main(String[] args) throws Exception{
long start=System.nanoTime();
BufferedReader br=new BufferedReader(new FileReader("D:\\text.txt"));
String line=""; int index=1;
StringBuilder sb=new StringBuilder();
HashMap<String,Integer> map=new HashMap<String,Integer>();
while((line=br.readLine())!=null){
if(map.containsKey(line))
sb.append(map.get(line)+" "+line+"\r\n");
else
map.put(line, index);
index++;
}
br.close();
FileWriter fr=new FileWriter("D:\\result.txt");
fr.write(sb+"");
fr.close();
long end=System.nanoTime();
System.out.println("运行时间:"+(end-start)+" ns");
}}
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);
}
}就像上面的实现
import java.io.*;
import java.util.*;
public class T { public static void main(String[] args) throws Exception{
long start=System.nanoTime();
LineNumberReader reader=new LineNumberReader(new FileReader("D:\\test.txt"));
String line="";
StringBuilder sb=new StringBuilder();
HashMap<Integer,String> map=new HashMap<Integer,String>();
map.clear();
while((line=reader.readLine())!=null){
if(!map.containsValue(line)){
map.put(reader.getLineNumber(),line);
sb.append(reader.getLineNumber()+":"+line+"\r\n");
}
}
reader.close();
long end=System.nanoTime();
FileWriter fr=new FileWriter("D:\\result.txt");
fr.write(sb+"");
String time="运行时间: "+(end-start)+" ns";
fr.write(time);
fr.flush();
fr.close();
}
}
大家试试这个啊,应该没有问题的
import java.io.*;
import java.util.*;
public class T { public static void main(String[] args) throws Exception{
long start=System.nanoTime();
LineNumberReader reader=new LineNumberReader(new FileReader("D:\\test.txt"));
String line="";
StringBuilder sb=new StringBuilder();
HashMap <Integer,String> map=new HashMap <Integer,String>();
map.clear();
while((line=reader.readLine())!=null){
if(!map.containsValue(line)){
map.put(reader.getLineNumber(),line);
sb.append(reader.getLineNumber()+":"+line+"\r\n");
}
}
reader.close();
long end=System.nanoTime();
FileWriter fr=new FileWriter("D:\\result.txt");
fr.write(sb+"");
String time="运行时间: "+(end-start)+" ns";
fr.write(time);
fr.flush();
fr.close();
}
}
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);
}
}
这么看起来 才好看!