请写一个程序找出附件中文件重复的行
输出:
  输出一个文本文件,给出哪些行是重复的,第一次出现的行号,格式如下
  行号 此行的文本内容
  并给出此程序的运行时间
用JAVA写

解决方案 »

  1.   

    如何读取文件内容:
    http://blog.csdn.net/YidingHe/archive/2008/12/27/3622915.aspx
      

  2.   

    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");
    }}
      

  3.   

    问题的关键不是读取行,而是比较。如果比读一行的,就和前面所有行比较的话,那么越到后来就越慢,而且这样的操作并不必要。我们可以用一个简单的查找来做,前提也是读取行,并且去行的头一个字母作为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);
      }
    }就像上面的实现
      

  4.   

    上面的代码是手写的,有错误的话,在IDE里面改一下就行了,只是给你写了比较的逻辑和对象的定义,上面的计较应该是可以节约时间和比较次数的。
      

  5.   


    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();
        }
    }
    大家试试这个啊,应该没有问题的 
      

  6.   


    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(); 
        } 

      

  7.   


    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);
      }
    }
     这么看起来 才好看!