A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 栗学魁 中级黑马   /  2012-8-29 21:37  /  1834 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 栗学魁 于 2012-8-29 22:45 编辑
  1. import java.io.BufferedReader;
  2. import java.io.FileReader;
  3. import java.io.IOException;
  4. import java.util.HashMap;
  5. import java.util.Iterator;
  6. import java.util.LinkedList;
  7. import java.util.List;

  8. /*
  9. * 查找文件里面重复的行,并输出全部重复的行号。
  10. *
  11. *
  12. */
  13. public class Test6 {
  14.   public static void main(String[] args) throws IOException {
  15.     BufferedReader reader = new BufferedReader(new FileReader("Test5.txt"));
  16.     String strline = "";
  17.     int row = 1;
  18.     HashMap<String, List<Integer>> map = new HashMap<String, List<Integer>>();
  19.     List<Integer> rowFound;
  20.     while ((strline = reader.readLine()) != null) {
  21.       // 尝试查找以前是否存在
  22.       rowFound = map.get(strline);
  23.       // 找到
  24.       if (rowFound != null) {
  25.         // 保存新行好
  26.         rowFound.add(row);
  27.       } else {
  28.         // 新行,没有重复的
  29.         List<Integer> list = new LinkedList<Integer>();
  30.         list.add(row);
  31.         map.put(strline, list);
  32.       }
  33.       row++;
  34.     }
  35.     reader.close();
  36.     // 开始显示长度超过一个的行数
  37.     Iterator<String> it = map.keySet().iterator();
  38.     String line;
  39.     while (it.hasNext()) {
  40.       line = it.next();
  41.       rowFound = map.get(line);
  42.       if (rowFound.size() > 1) {
  43.         System.out.print(line);
  44.      //   System.out.println(line);//如是不加Ln就不换行,但是加了会在输出结果前多一行,哪里错了?
  45.         for (Integer rowNum : rowFound) {
  46.           System.out.print("," + rowNum);
  47.         }
  48.       }
  49.     }
  50.   }
  51. }
复制代码
哪写错了

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1

查看全部评分

4 个回复

倒序浏览
把后面那句加上ln
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/*
* 查找文件里面重复的行,并输出全部重复的行号。
*
*
*/
public class Test6 {
  public static void main(String[] args) throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader("Test5.txt"));
    String strline = "";
    int row = 1;
    HashMap<String, List<Integer>> map = new HashMap<String, List<Integer>>();
    List<Integer> rowFound;
    while ((strline = reader.readLine()) != null) {
      // 尝试查找以前是否存在
      rowFound = map.get(strline);
      // 找到
      if (rowFound != null) {
        // 保存新行好
        rowFound.add(row);
      } else {
        // 新行,没有重复的
        List<Integer> list = new LinkedList<Integer>();
        list.add(row);
        map.put(strline, list);
      }
      row++;
    }
    reader.close();
    // 开始显示长度超过一个的行数
    Iterator<String> it = map.keySet().iterator();
    String line;
    while (it.hasNext()) {
      line = it.next();
      rowFound = map.get(line);
      if (rowFound.size() > 1) {
        System.out.print(line);
     //   System.out.println(line);//如是不加Ln就不换行,但是加了会在输出结果前多一行,哪里错了?楼主可以这句不加ln        for (Integer rowNum : rowFound) {
          System.out.print("," + rowNum);//再把这句加上ln        }
      }
    }
  }
}
回复 使用道具 举报
曹昌 发表于 2012-8-29 21:50
把后面那句加上ln
import java.io.BufferedReader;
import java.io.FileReader;


改后面就成这样了,更不对了
回复 使用道具 举报
本帖最后由 唐志兵 于 2012-8-29 22:17 编辑

楼主我给你发个我想出来的方法,看哪个更简单。
  1. import java.io.BufferedReader;
  2. import java.io.BufferedWriter;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStreamWriter;
  7. import java.util.HashSet;

  8. public class textDemo {
  9.         public static void main(String[] args) throws Exception {
  10.                 String str;
  11.                 HashSet<String> hs = new HashSet<String>();
  12.                
  13.                 BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\123.txt")));
  14.                 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D:\\456.txt")));
  15.                
  16.                 while((str = br.readLine()) != null){
  17.                         System.out.println(str);
  18.                         if (!hs.add(str)) {
  19.                                 System.out.println("发现重复的行");        //这里的原理就是根据 set集合的特性 不能添加重复的元素,如果元素重复,添加的时候返回false
  20.                                 continue;                                                                  //这样是不是超简单呢??
  21.                         }
  22.                         bw.write(str + "\r\n");
  23.                 }
  24.                
  25.                 bw.close();
  26.                 br.close();
  27.         }
  28. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
包晗 + 1

查看全部评分

回复 使用道具 举报
唐志兵 发表于 2012-8-29 22:15
楼主我给你发个我想出来的方法,看哪个更简单。

受教了!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马