在循环中创建2个HashMap以比较值

时间:2016-11-09 09:40:16

标签: java hashmap

我正在读取多个管道分隔记录的txt文件,每个记录标记对应唯一键和不同的值。我需要比较每个记录值(使用相同的键)。为了比较这一点,我想使用HashMap存储第一条记录,然后迭代并存储第二条记录。之后将比较两个hashmap以查看两者是否包含相似的值。但我不确定如何在读取txt文件时在同一循环内管理或创建2个hashma。 示例: txt文件如下

A|B|C|D|E
A|B|C|O|E 
O|O|C|D|E

每条记录的每个标记将根据唯一键存储,如下所示 第一条记录

map.put(1, A);
map.put(2, B);
map.put(3, C);
map.put(4, D);
map.put(5, E);

第二条记录

map.put(1, A);
map.put(2, B);
map.put(3, C);
map.put(4, O);
map.put(5, E);

第三条记录

map.put(1, O);
map.put(2, O);
map.put(3, C);
map.put(4, D);
map.put(5, E);

当我使用输入流读取java中的每条记录时,在读取记录的同一循环中,如何创建2条不同记录的2个hashmap进行比较。

FileInputStream fstream;
            fstream = new FileInputStream("C://PROJECTS//sampleInput.txt");
            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
                //Read File Line By Line
             String line1=null;
             while ((line1 = br.readLine()) != null){            
              Scanner scan = new Scanner(line1).useDelimiter("\\|");
              while(scan.hasNext()){
                // reading each token of the record

                // how to create 2 hashmap of 2 records to compare.. or is there any simple way to compare each incoming records 
              }
              printIt(counter);
            }

2 个答案:

答案 0 :(得分:0)

通过为每条读取线创建一个新的HashMap,也许你在想这里有点太复杂了。我宁愿建议创建ArrayList<String>(或其他一些1维数据结构)并按顺序存储所有读取行。之后,您可以迭代此数据结构,并使用字符串方法将每个值相互比较。

答案 1 :(得分:0)

如果您只想计算差异数,可以使用以下示例:

int diffCount = 0;
String fileName = "test.psv";
try (CSVReader reader = new CSVReader(new FileReader(fileName), '|')) {
    String[] prevLine = reader.readNext();
    String[] nextLine;
    while (prevLine != null && (nextLine = reader.readNext()) != null) {
        if (!Arrays.equals(prevLine, nextLine)) {
            diffCount++;
        }
        prevLine = nextLine;
    }
    logger.info("Diff count: {}", diffCount);
} catch (FileNotFoundException e) {
    logger.error("enable to find file {}", fileName, e);
} catch (IOException e) {
    logger.error("Got IO exception", e);
}

如果由于某些原因你真的想要创建两个hashmap,你可以尝试这样做:

int diffCount = 0;
String fileName = "test.psv";
try (CSVReader reader = new CSVReader(new FileReader(fileName), '|')) {
    Map<Integer, String> prevLine = readNextLine(reader);
    Map<Integer, String> nextLine;
    while (prevLine != null && (nextLine = readNextLine(reader)) != null) {
        if (!prevLine.equals(nextLine)) {
            diffCount++;
        }
        prevLine = nextLine;
    }
    logger.info("Diff count: {}", diffCount);
} catch (FileNotFoundException e) {
    logger.error("enable to find file {}", fileName, e);
} catch (IOException e) {
    logger.error("Got IO exception", e);
}

private Map<Integer, String> readNextLine(CSVReader reader) throws IOException {
    String[] nextLine = reader.readNext();
    return nextLine != null ? convert2map(nextLine) : null;
}

private Map<Integer, String> convert2map(String[] nextLine) {
    return IntStream.range(0, nextLine.length)
            .boxed()
            .collect(toMap(identity(), (index) -> nextLine[index]));
}