在地图中将两个比较字符串作为键的最佳方法是什么?

问题描述

首先,原始实现来自此处:Compare 2 text files in java and write the difference in both separately into another file

我有两个文件

file1.txt 具有以下值:

11,12 (13,13): [0:1.0]
14,15 (16,16): [0:99]
17,18 (19,20): [0:99]

file2.txt 具有以下值:

12,11 (13,16): [0:99]
18,17 (20,19): [0:99]

首先,我阅读了所有file1.txt并将这些元素添加Map < String,Integer >中。 当我开始读取第二个file2.txt时,我会将读取的当前行与file1.txt中的行进行比较,如果为true,则删除该行(因为我想检查第二个文件中的所有行是否都包含在第一个文件文件

对于我的问题,此行11,13): [0:1.0] = 12,13): [0:1.0], 还有这个17,20): [0:99] = 18,19): [0:99]

这是我到目前为止所做的,但是我不确定这并不是实现我想要的最佳方法。您能帮我更有效地做到这一点吗?非常感谢

BufferedReader br1 = null;
BufferedReader br2 = null;
BufferedWriter bw3 = null;
String sCurrentLine;


//HashMap<String,Integer> expectedrecords = new HashMap<String,Integer>();
HashMap<String,Integer> actualrecords   = new HashMap<String,Integer>();

Map<String,Integer> expectedrecords = new ConcurrentHashMap<String,Integer>();

br1 = new BufferedReader(new FileReader("file1.txt"));
br2 = new BufferedReader(new FileReader("file2.txt"));

// create object of Path 
Path path = Paths.get("file1.txt"); 
Path path2 = Paths.get("file2.txt"); 

// call getFileName() and get FileName path object 
Path fileName = path.getFileName();
Path fileName2 = path2.getFileName();

while ((sCurrentLine = br1.readLine()) != null) 
{
    if(!Character.isDigit(sCurrentLine.charat(0)))
    {
        continue;
    }
    
    String splitter [] = sCurrentLine.split("[\\s,]+");
    
    String[] pos2 = splitter[2].split("[\\s(]+");
    String[] pos3 = splitter[3].split("[\\s)]+");
    

    // Here I add the possible changes for the original line  (from file1.txt) that
    // Could exist in file2.txt

    String sCurrentLine2 = "" +splitter[1]+ "," +splitter[0]+ " " +splitter[2]+ "," +splitter[3]+ " " +splitter[4]+ "";
    
    String sCurrentLine3 = "" +splitter[1]+ "," +splitter[0]+ " (" +pos3[0]+ "," +pos2[1]+ "): " +splitter[4]+ "";
                                            
    if(expectedrecords.containsKey(sCurrentLine))      
    {
        expectedrecords.put(sCurrentLine,expectedrecords.get(sCurrentLine) + 1);
    }
    else 
    {               
        expectedrecords.put(sCurrentLine,1); 
        
        if(sCurrentLine2.equals(sCurrentLine3))
        {
            expectedrecords.put(sCurrentLine2,1);  

        }
        else
        {
            expectedrecords.put(sCurrentLine2,1);  
            expectedrecords.put(sCurrentLine3,1); 
        }
         
    }           
}
      
while ((sCurrentLine = br2.readLine()) != null)
{ 
    if(!Character.isDigit(sCurrentLine.charat(0)))
    {
        continue;
    }
    
    String splitter [] = sCurrentLine.split("[\\s,]+");
    
    String[] pos2 = splitter[2].split("[\\s(]+");
    String[] pos3 = splitter[3].split("[\\s)]+");
    
    String sCurrentLine1 = "" +splitter[0]+ "," +splitter[1]+ " (" +pos3[0]+ "," +pos2[1]+ "): " +splitter[4]+ "";
    String sCurrentLine2 = "" +splitter[1]+ "," +splitter[3]+ " " +splitter[4]+ "";
    String sCurrentLine3 = "" +splitter[1]+ "," +pos2[1]+ "): " +splitter[4]+ "";

    
    System.out.println("Linha atual: " +sCurrentLine);
                            
    if (expectedrecords.containsKey(sCurrentLine)) 
    {
        int expectedCount = expectedrecords.get(sCurrentLine) - 1;
        
        if (expectedCount == 0)
        {
            //expectedrecords.remove(sCurrentLine);
            
            expectedrecords.remove(sCurrentLine);
            expectedrecords.remove(sCurrentLine1);
            expectedrecords.remove(sCurrentLine2);
            expectedrecords.remove(sCurrentLine3);                                      
        } 
        else 
        {
            expectedrecords.put(sCurrentLine,expectedCount);
        }
    } 
    else 
    {
        if (actualrecords.containsKey(sCurrentLine)) 
        {
            actualrecords.put(sCurrentLine,actualrecords.get(sCurrentLine) + 1);
        } 
        else 
        {
            actualrecords.put(sCurrentLine,1);
        }
    }              
}


br1.close();
br2.close();
          
// expected is left with all records not present in actual
// actual is left with all records not present in expected

bw3 = new BufferedWriter(new FileWriter(new File("difference.txt")));
bw3.write("Records which are present in: "+fileName+" but it's not present in: "+fileName2+ " \n\n");
for (String key : expectedrecords.keySet()) 
{
    for (int i = 0; i < expectedrecords.get(key); i++) 
    {
        bw3.write(key);
        bw3.newLine();
    }
}

bw3.write("\nRecords which are present in: "+fileName2+" but it's not present in: "+fileName+" \n\n");
for (String key : actualrecords.keySet()) 
{
    for (int i = 0; i < actualrecords.get(key); i++) 
    {
        bw3.write(key);
        bw3.newLine();
    }
}
bw3.flush();
bw3.close();

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)