2016-09-08 31 views
1

我想结合两个相似类型的数组列表。但是有条件地,如果一个对象的属性匹配,则将其他对象的属性合并为一个。组合两个对象的ArrayList,并在合并时有条件地改变对象的值

这里是我的模型类

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

我有这种类型的对象的筛选

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

我想他们在这样的方式组合两个arrylist,所以combined输出,将是这样的

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

我看了其他SO问题,但无法找到这是一个有效的方法。 在此先感谢

回答

1

你可以设置这样做。(可使用linkedhashset维持秩序)

 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

谢谢,你刚才救了我的一天 –

1

如果你不关心元素的顺序,它可能会更有意义改为使用Set。 如果您将元素添加到Set,则元素将使用.equals进行测试,并且不会添加重复项。

但是,如果您需要对列表进行排序,您可以使用removeAll(Collection<?> c)方法删除列表中的重复元素。

就像这个...

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