2013-01-24 109 views
-1

我想合併Java中的兩個對象列表。一個是來自數據庫的對象列表,第二個列表來自Excel。來自excel列表的數據庫的Java合併列表

  1. 對象的第一個列表包含類似的數據: [name(str),valid_from(date),valid_to(date),active(flag)]
    對象相等,如果名稱,有效標誌都是平等和OBJ1日期,OBJ 2 - VALID_FROM,失效日期是不相交的區間。
    只有當活動標誌不相等時,列表中可以有兩個重疊的日期間隔和相同的名稱。

  2. 對象的第二個列表包含相同的數據和有關是否要更新,刪除或第一名單上創造新的記錄也信息: [name(str),valid_from(date),valid_to(date),active(flag), action_type(c/u/d)]

//編輯:我的代碼是:

public class ClassA { 
    private String name; 
    private Date validFrom; 
    private Date validTo; 
    private boolean active; 

    public ClassA(String name, Date validFrom, Date validTo, boolean active) { 
     this.name = name; 
     this.validFrom = validFrom; 
     this.validTo = validTo; 
     this.active = active; 
    } 

    public String getName() { 
     return name; 
    } 

    public Date getValidFrom() { 
     return validFrom; 
    } 

    public Date getValidTo() { 
     return validTo; 
    } 

    public boolean isActive() { 
     return active; 
    } 

public static void main(String[] args) { 
    List<ClassA> objectsFromDB = getObjectsFromDB(); 
    List<ClassB> objectsFromFile = getObjectsFromFile(); 

    Map<String, ClassA> objectNameToClassA = buildObjectNameToClassAMap(objectsFromDB); 

    List<ClassA> objectsToCreate = new ArrayList<ClassA>(); 
    List<ClassA> objectsToUpdate = new ArrayList<ClassA>(); 
    List<ClassA> objectsToDelete = new ArrayList<ClassA>(); 

    for(ClassB object: objects) { 
     ActionType actionType = object.getActionType(); 
     if(ActionType.CREATE.equals(actionType) { 
      objectsToCreate.add(object.getObjectA()); 
     } 
     if(ActionType.UPDATE.equals(actionType) { 
      objectsToUpdate.add(object.getObjectA()); 
     } 
     if(ActionType.DELETE.equals(actionType) { 
      objectsToDelete.add(object.getObjectA()); 
     } 
    } 


} 

    private static Map<String, ClassA> buildObjectNameToClassAMap(List<ClassA> objects) { 
     Map<String, ClassA> result = new LinkedHashMap<String, ClassA>(); 
     for(ClassA object: objects) { 
      result.put(object.getName(), object); 
     } 
     return result; 
    } 

} 

enum ActionType { 
    CREATE, UPDATE, DELETE; 
} 

class ClassB { 
    private ClassA classA; 
    private ActionType actionType; 
    public ClassB(ClassA classA, ActionType actionType) { 
     this.classA = classA; 
     this.actionType = actionType; 
    } 

    public ClassA getClassA() { 
     return classA; 
    } 

    public ActionType getActionType() { 
     return actionType; 
    } 

} 
+0

對象的類型究竟是什麼?他們都是'字符串'嗎? –

+0

數據類型不是字符串,但對象ClassA包含字段:String,Date Valid From,Date Valid To,boolean active和ClassB具有相同的字段以及具有選項的枚舉操作類型[C(reate new)/ U(pdate)/刪除)。我的解決方案是假定數據庫中的對象格式正確,然後:1.構建Map - Map BlueLettuce16

回答

0

我會首先爲您的對象定義一個類,以覆蓋equals方法,以尊重您的平等條件。然後我會使用其中一個實現Set接口的java.util類,例如HashSet。然後在你的對象上使用這個集合的add方法。在集合算術中,添加是一個集合,因此它執行合併。

+0

我將嘗試修改我的解決方案以使用HashSet而不是map,並且已經實現等號方法。謝謝,也許這會幫助... – BlueLettuce16