2016-09-08 2 views
1

Ich möchte zwei ähnliche Arraylist kombinieren. Wenn jedoch die Eigenschaft eines Objekts mit der Eigenschaft eines anderen Objekts übereinstimmt, werden sie in einer Bedingung kombiniert.Kombinieren Sie zwei ArrayList des Objekts und bedingt den Wert des Objekts beim Kombinieren

Hier meine Modellklasse ist

public class SampleModel { 

    int number; 
    String name; 
    boolean isSimilar; 

    public SampleModel(int number, String name, boolean isSimilar) { 
     this.number = number; 
     this.name = name; 
     this.isSimilar = isSimilar; 
    } 

    public int getNumber() { 
     return number; 
    } 

    public void setNumber(int number) { 
     this.number = number; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public boolean isSimilar() { 
     return isSimilar; 
    } 

    public void setSimilar(boolean similar) { 
     isSimilar = similar; 
    } 


    @Override 
    public boolean equals(Object o) { 
     boolean result = false; 
     if (this == o){ 
      result = true; 
     } 
     if (o == null || getClass() != o.getClass()){ 
      result = false; 
     } 
     SampleModel that = (SampleModel) o; 

     if(name.matches("(.*)"+that.name+"(.*)")){ 
      result = true; 
     } 

     if(name.matches("(.*)"+that.name)){ 
      result = true; 
     } 

     if(name.matches(that.name+"(.*)")){ 
      result = true; 
     } 

     if(name.contains(that.name)){ 
      result= true; 
     } 

     return result; 
    } 

    @Override 
    public int hashCode() { 
     return Objects.hash(name); 
    } 
} 

Und ich habe zwei arrylist dieser Art von Objekt wie dieses

ArrayList<SampleModel> sampleModels_one = new ArrayList<SampleModel>(); 
    ArrayList<SampleModel> sampleModels_two = new ArrayList<SampleModel>(); 
    ArrayList<SampleModel> combined = new ArrayList<SampleModel>(); 

    sampleModels_one.add(new SampleModel(1,"a",true)); 
    sampleModels_one.add(new SampleModel(1,"b",true)); 
    sampleModels_one.add(new SampleModel(1,"c",true)); 

    sampleModels_two.add(new SampleModel(1,"b",false)); 
    sampleModels_two.add(new SampleModel(2,"c",false)); 
    sampleModels_two.add(new SampleModel(3,"d",false)); 
    sampleModels_two.add(new SampleModel(3,"e",false)); 

ich sie in einer solchen Art und Weise kombinieren wollen, so dass der Ausgang von combined, wird so sein

SampleModel(1,"a",true) 
SampleModel(1,"b",true) 
SampleModel(1,"c",true) 
SampleModel(1,"d",false) 
SampleModel(1,"e",false) 

Ich habe andere SO Frage gesucht, konnte aber nicht finden ein effizienter Weg dazu. Vielen Dank im Voraus

Antwort

1

Sie können es so mit Set tun.

 combined.addAll(sampleModels_two); 
     combined.addAll(sampleModels_one); 

     Set<SampleModel> hs = new LinkedHashSet<>(); 
     hs.addAll(sampleModels_one); 
     hs.addAll(sampleModels_two); 
     combined.clear(); 
     combined.addAll(hs); 
+1

Danke, du gerettet gerade meinen Tag –

1

Wenn Sie kümmern sich nicht um die Reihenfolge der Elemente (LinkedHashSet für die Aufrechterhaltung der Ordnung verwenden können), könnte es mehr Sinn machen, stattdessen einen Set verwenden. Wenn Sie Elemente zu einem Set hinzufügen, werden die Elemente mit .equals getestet und Duplikate werden nicht hinzugefügt.

Wenn Sie jedoch ein Gefühl der Ordnung in Ihre Liste haben müssen, können Sie die Methode removeAll(Collection<?> c) verwenden, um doppelte Elemente der Liste zu entfernen.

Like this ...

ArrayList<SampleModel> combined = new ArrayList<SampleModel>(); combined.addAll(sampleModels_one); combined.removeAll(sampleModels_two); combined.addAll(sampleModels_two);

Verwandte Themen