2016-11-05 16 views
-4

おそらくコレクションクラスを使用して、Javaで2つの同様のテーブルを比較する必要があります。しかし、入力ソースはデータベースではなくクリップボードです。サンプルテーブル: -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は一意です。 Table1のRow1はTable2のRow1と比較する必要があります&など。対応する列のEmpID &のデータが一致する場合は一致として表示されます。 EmpIDが2行目と一致しない場合は、Diffとして報告する必要があります。次の表2の検索で& EmpIDを見つけてください。一致する場合は報告してください。 見つからない場合は、Table1で余分、Table2でMissを報告する必要があります。これらの行は、比較後に一致、Diff、余分、または不一致として報告する必要があります。

ここでは比較目的で入れ子になったHashMapを使用しようとしました。 複数の行がHashMapに追加されるとき、それはデカルト積比較を実行する。表1、行1とTable2、行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 キー:名前、年齢、部門 値:ジョン、30、オプス

差分: のemp ID:456 キー:部門 値:HR、Devの

エクストラ: InTable1:EmpのID:789(キーを印刷値は、もしあれば)表2において :EMPID:879(任意のキー&値を出力)

ミス:表1に : のEmp ID:489 名前、年齢、オプス において部門 エクシーズ、26、表2:同様にある場合

+0

あなたのサンプルから望ましい出力を投稿できますか?要件は私にはあまり明確ではない – Massimo

+0

データを適切に保持するためにクラス/オブジェクトを使用する必要があります。マップ/コレクションを入れ子にしているときには、デザインを再考するのはほとんどいつものことです(ご覧のとおり、速い)。次に、比較は約1行のコードとなります – Rogue

答えて

1

Shardhaはより良い設計アプローチを行います。

ここでは2つのテーブルを2つのhashMapsとしてプリペアしています。各ハッシュマップのキーはempidで、値は "EmpDetails"オブジェクトです。このempdetailsはage、name、departmentをattributesとして保持します。これらの値はコンストラクタを使用して設定できます。ここでは、2つのオブジェクトを比較するequalsメソッドもオーバーライドしています。

私はあなたの「Miss」と「Extra」の要件を正しく理解しています。しかし、私はそれが小さなセグメントであり、あなた自身がそれを追加できると思います。メインクラスの下に見つけてください:ここでは

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


    } 

この回答へのコメント欄に、さらにクエリを明記してください。