在检索2条记录的差异时未获得预期输出

时间:2017-07-14 10:53:53

标签: java linux

问题

我的file1在一个文件中有20,000个数字,file2在另一个文件中有9997个数字。 我想要文件2中没有的数字,即那些10,003个数字

解决方案

我创建了3个HashMap。

1)第一个HashMap存储第一个文件的记录,第二个HashMap存储第二个文件的记录,第三个HashMap存储文件记录差异的记录。

2)I Applied包含在file1中搜索file2记录的方法。如果file1记录不存在,我放入第三个hashmap。

public class ReadFromFile {
static HashMap hm=null;
static HashMap hm1=null;
static HashMap hm2=null;

private static final String FILENAME = "/home/jalaj/Download/PrimaryBase";
private static final String FILENAME1 = "/home/jalaj/Downloads/logsBase";

public static void main(String[] args) {
    hm2=new HashMap<>();
    int count=0;
     hm=readFromFile(FILENAME);

     hm1=readFromFile(FILENAME1);
     Set s=hm.keySet();
     Iterator it=s.iterator();
     while(it.hasNext()){    
         String me=(String)(it.next());
if(!(hm1.containsKey(me))){
             hm2.put(me,0);
             count++;
         }   
     }  
     System.out.println(count);
 }

 public static HashMap readFromFile(String FILENAME){
    int count=0; 
    hm=new HashMap();
    BufferedReader br = null;
    FileReader fr = null;

    try {

        fr = new FileReader(FILENAME);
        br = new BufferedReader(fr);

        String sCurrentLine;

        br = new BufferedReader(new FileReader(FILENAME));

        while ((sCurrentLine = br.readLine()) != null) {
            hm.put(sCurrentLine, 0);
            count++;
        }

    } catch (IOException e) {

        e.printStackTrace();

    } finally {

        try {

            if (br != null)
                br.close();

            if (fr != null)
                fr.close();

        } catch (IOException ex) {

            ex.printStackTrace();

        }

    }
    System.out.println(count);
    return hm;
}

}

输出

20000

9997

0

预期产出

20000

9997

10003

2 个答案:

答案 0 :(得分:3)

查看你的代码。在readFromFile(String name)中,您将hm属性重新声明为hm= new HashMap(),并在初始化后返回。这导致hmhm1都具有相同的值,因此hm2不存储任何差异。

将此行hm= new HashMap();更改为此HashMap hm= new HashMap(); evolià。

PD:此外,您应使用size()代替计数变量,并使用HashSet作为Michael Markidis建议。

编辑:在阅读他的评论之前,我意识到与迈克尔·马基迪斯一样的事情,所以伟大的思想迈克尔·马基迪斯!

答案 1 :(得分:0)

我假设file1和file2中的数字是唯一的。如果是这种情况,代码需要修改逻辑以及详细程度。我把它重构为:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class ReadFromFile {

    private static final String FILENAME = "/home/jalaj/Download/PrimaryBase";
    private static final String FILENAME1 = "/home/jalaj/Downloads/logsBase";

    public static void main(String[] args) {
        ArrayList<Integer> firstList = readFromFile(FILENAME);
        ArrayList<Integer> secondList = readFromFile(FILENAME1);
        ArrayList<Integer> outputList = new ArrayList<>();

        for (Integer number : firstList) {
            if(!secondList.contains(number)) {
                outputList.add(number);
            }
        }

        System.out.println(outputList.size());
    }

    public static ArrayList<Integer> readFromFile(String FILENAME){
        ArrayList<Integer> list = new ArrayList<>();
        try {
            FileReader fr = new FileReader(FILENAME);
            String sCurrentLine;
            BufferedReader br = new BufferedReader(new FileReader(FILENAME));
            while ((sCurrentLine = br.readLine()) != null) {
                list.add(Integer.parseInt(sCurrentLine.trim()));
            }
            br.close();
            fr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(list.size());
        return list;
    }
}

此代码应产生预期的输出。