2016-11-05 103 views
-4

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

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| 

这里雇员ID是唯一的。 Table1的Row1应与Table2的Row1比较&等。如果EmpID &中的相应列中的数据匹配,则应显示为匹配。 如果EmpID与第二行不匹配,则应报告为差异,搜索表2的下一行&找到EmpID。报告是否匹配。 如果未找到,则应在Table1中报告额外报告或在Table2中报告Miss。所有这些行必须在比较为Match,Diff,Extra或Miss之后进行报告。

试图在此处使用嵌套的HashMap进行比较,当只比较一行时,它可以正常工作。 当多个行添加到HashMap中时,它执行笛卡尔产品比较I.e.表1,行1与表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 键:名字,年龄,DEPT 值:约翰,30,行动

DIFF: 的Emp ID:456 重点:部门 值:人力资源,开发

附加: InTable1:的Emp ID:789(打印键&的值,如果有的话) 在表2:EMPID:879(打印中的任意键&值)

小姐: 在表1: 的Emp ID:489 名字,年龄,DEPT 的Xyz,26,行动 在表2:同样如果有的话

+0

你可以发布你的例子所需的输出吗?要求对我来说不是很清楚 – Massimo

+0

您应该使用类/对象来适当保存您的数据,当您发现自己嵌套地图/集合时,几乎总是有时间重新考虑设计(正如您所看到的,这会变得非常复杂和混乱)快速)。然后比较将是关于一行代码 – Rogue

回答

1

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

在这里,我已经作为2个hashMap预备了2个表。每个hashmap的key是empid,value是一个“EmpDetails”对象。这empdetails将年龄,名称,部门作为属性。我们可以使用构造函数设置这些值。在这里,我也重写了“equals”方法来比较2个对象。

我还没有正确理解你对“小姐”和“额外”的要求。但我认为它是一个小细分市场,你可以通过它自己添加它。请找主类如下:

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; 
    } 


    } 

请注明您的进一步查询,在评论这个答案。