我必须在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中:类似,如果有的话
答案 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;
}
}
请在评论中提及您对此答案的进一步询问。