我正在读取多个管道分隔记录的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);
}
答案 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]));
}