比较Java中的两个表(不是数据库)

时间:2016-11-05 08:55:16

标签: java collections

我必须在Java中比较2个类似的表,可能使用集合类。但输入源是剪贴板而不是数据库。样本表: -

Table1:
 |EmpID| Name| Age|Dept|
 |123|John|30|Ops|
 |456|Peter|40|HR|

Table2:
|EmpID| Name| Age|Dept|
|123|John|30|Ops|
|462|Peter|40|Dev|

此处Emp ID是唯一的。表1的Row1应该与Table2的Row1相比较。等等。如果EmpID&相应列中的数据匹配,它应显示为匹配。 如果EmpID与第二行不匹配,则应在表2的下一行中报告为Diff,Search。找到EmpID。报告是否匹配。 如果未找到,则应在Table1中报告为额外的,或在表2中报告为Miss。所有这些行必须在比较后报告为Match,Diff,Extra或Miss。

此处尝试使用嵌套的HashMap进行比较,只需要比较一行时就可以正常工作。 当多行添加到HashMap时,它会进行笛卡尔积比较。表1,第1行,表2,第2行和第2行。所以因此输入错误。 (请参阅下面的示例代码)。 您能否建议我如何进行这些比较/迭代,因为我还必须在比较后进行报告。

HashMap<String,String> Table1= new HashMap<String,String>();
Table1. put( Name, "John");
Table1. put(Age,"30");  
Table1.put(Dept, "Ops"); 

HashMap<String,String> Table2= new   HashMap<String,String>();
Table2.put( Name, "John");
Table2. put(Age,"30"); 
Table2.put(Dept, "Ops"); 

HashMap<String, HashMap<String, String>>Table3= new    HashMap<String, HashMap<String,String>>();
Table3.put(EmpId, "123"); 

HashMap<String, HashMap<String, String>>Table4= new   HashMap<String, HashMap<String,String>>();
Table4.put(EmpId, "123"); 

List<String> match = new List<String>();
List< String> diff = new List<String>();

for ( String tempe: Table3.keySet()){ 
for(String temp: Table4.keySet()) {

If(tempe.equals temp){
System.out.println("Emp Id match");

for(String tem: Table1.keySet()){
for(String te: Table2.keySet()){

If(tem equals te){
match.add( tem);
}else{
diff.add(temp + te);
} 
}
}
else{
System.out.println(" EmpId not matching");
}
}
}

for( String mat: match){
 System.out println("Matched values: + mat ");
 }
for( String dif: diff){
System.out.println("Different values: + dif");
}

所需的输出是:

匹配度: Emp ID:123 关键:姓名,年龄,部门 值:John,30,Ops

差异: Emp ID:456 关键:部门 值:HR,Dev

额外: InTable1:Emp ID:789(打印键和值,如果有的话) 在表2中:EmpId:879(打印键和任意值)

小姐:  在表1中: Emp ID:489 姓名,年龄,部门 Xyz,26岁,Ops 在表2中:类似,如果有的话

1 个答案:

答案 0 :(得分:1)

Shardha让我们做出更好的设计方法。

这里我已经预先准备了2个表作为2个hashMaps。每个hashmap的键是empid,value是&#34; EmpDetails&#34;宾语。这个empdetails将age,name,department作为attributes.we可以使用构造函数设置这些值。在这里,我也覆盖了#34; equals&#34;比较2个对象的方法。

我不明白你对'#34; Miss&#34;和&#34;额外&#34;正常。但我认为它只是一个小部分,你可以自己添加它。请在下面的主要课程中找到:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


    public class Main {
    public static void main(String[] args) {
    Map<String,EmpDetails> table1=new HashMap<String,EmpDetails>();
    Map<String,EmpDetails> table2=new HashMap<String,EmpDetails>();

    EmpDetails emp1=new EmpDetails("John", "30", "Ops");
    table1.put("123",emp1);

    EmpDetails emp2=new EmpDetails("John", "30", "Ops");
    table2.put("123",emp2);

    EmpDetails emp3=new EmpDetails("Amy", "30", "Ops");
    table1.put("127",emp3);

    EmpDetails emp4=new EmpDetails("Rachel", "30", "Ops");
    table2.put("127",emp4);

    List<String> match = new ArrayList<String>();
    List< String> diff = new ArrayList<String>();

    for(String empIdTable1:table1.keySet())
    {
        EmpDetails tempemp1;
        EmpDetails tempemp2;
        for(String empIdTable2:table2.keySet())
        {
            if(empIdTable1.equalsIgnoreCase(empIdTable2))
            {
                tempemp1=table1.get(empIdTable1);
                tempemp2=table2.get(empIdTable2);
                if(tempemp1.equals(tempemp2))
                {
                    match.add(empIdTable1);
                    break;
                }else{
                    diff.add(empIdTable1);
                }
            }
        }

    }
    System.out.println(" Match :"+match);
    System.out.println(" diffn :"+diff);

}

 }

以下是Empdeatils课程:

 public class EmpDetails {
    private String name;
  private String age;
   private String dept;
   public EmpDetails(String name, String age, String dept) {
    super();
    this.name = name;
    this.age = age;
    this.dept = dept;
   }

@Override
public boolean equals(Object obj) {
    // TODO Auto-generated method stub
    Boolean response=false;
    if(obj!=null && obj instanceof EmpDetails)
    {
        EmpDetails objParam=(EmpDetails)obj;

        if(objParam.name.equalsIgnoreCase(this.name) && objParam.age.equalsIgnoreCase(this.age) && objParam.dept.equalsIgnoreCase(this.dept))
        {
            response=true;
        }
    }
    return response;
  }


    }

请在评论中提及您对此答案的进一步询问。