比较两个列表对象

时间:2017-01-03 06:37:41

标签: java android list compare contains

我有两个列表如下:

List<Category> categories;
List<Category> selectedCategories;

和类别模型:

(id,catTitle,catId)  

但是我想比较两个列表:

selectedCategories:[{id=3, catTitle='first', catId=17},{id=4, catTitle='second', catId=18}]
categories: [{id=null, catTitle='first', catId=17}

并获取{id = 3,catTitle =&#39; first&#39;,catId = 17}

但是当id为null时,如何将{id = 3,catTitle =&#39; first&#39;,catId = 17}作为结果?!!!

4 个答案:

答案 0 :(得分:3)

pubic class Category {
   Integer id;
   int catId;
   String catTitle;
   ..........................

   @Override   
   public boolean equals(Object other) {
       return (other instanceOf Category) && equate((Category) other);
   }  

   private boolean equate(Category other) {
       return other != null &&
           catId == other.catId &&  
           equateIds(id, other.id) && 
           equateTitles (catTitle, other.catTitle);
   } 

   // Ids are considered equal, if equal, or at least one is null
   private static bool equateIds(Integer id1, Integer id2) {
      return (id1==null) || (id2==null) ||
            id1.intValue() == id2.intValue(); 
   } 

   // Titles are considered equal, if equal, or both null
   private static bool equateTitles(String title1, Integer title2) {
      return (title1==null) ? (title2 == null) : title1.equals(title2);
   } 

}

更新:为了保持一致性,您还需要hashCode忽略id:

@Override
public int hashCode() {
    return catId + ((catTitle == null) ? 0 : catTitle.hashCode());
}

获得共同元素:

List<Category> selectedElements = (new List<Category>(originalList)).retainAll(lookForList);

答案 1 :(得分:0)

如果您使用Model类,则需要手动匹配

但是您将数据存储在json中,然后存储在

List<String> categories;

并将数据存储为Json.string(),然后您就可以轻松匹配记录..

答案 2 :(得分:0)

我是用这种方法做到的,希望这会对你有帮助。!

for (Questions questionsListx : questionsList) {
            // Loop arrayList1 items
            boolean found = false;
            for (Questions answeredlistx : answeredQuestionList) {
                if (answeredlistx.getIdQuestion() == questionsListx.getIdQuestion()) {
                    found = true;
                }
            }
            if (!found) {
                unAnsweredQuestionList.add(questionsListx);
            }


        }

答案 3 :(得分:0)

你可以使用Arrays.deepEquals()。为了正确使用它,你需要覆盖hashCode()和equals()。这是示例代码。

class Category {
        Integer id;
        int catId;
        String catTitle;

        public Category(Integer id, int catId, String catTitle) {
            this.id = id;
            this.catId = catId;
            this.catTitle = catTitle;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + catId;
            result = prime * result + ((catTitle == null) ? 0 : catTitle.hashCode());
            result = prime * result + ((id == null) ? 0 : id.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Category other = (Category) obj;
            if (catId != other.catId)
                return false;
            if (catTitle == null) {
                if (other.catTitle != null)
                    return false;
            } else if (!catTitle.equals(other.catTitle))
                return false;
            if (id == null) {
                if (other.id != null)
                    return false;
            } else if (!id.equals(other.id))
                return false;
            return true;
        }
    }

现在你可以使用Arrays.deepEquals()作为

 List<Category> list1 = Arrays.asList(new Category(1, 1001, "first"), new Category(2, 1001, "second"),
                    new Category(3, 1001, "third"), new Category(4, 1001, "four"));
 //same as content of list1
 List<Category> list2 = Arrays.asList(new Category(1, 1001, "first"), new Category(2, 1001, "second"),
                new Category(3, 1001, "third"), new Category(4, 1001, "four"));

 //change in catTitle
 List<Category>  list3 = Arrays.asList(new Category(1, 100, "list3first"),new Category(2, 1001, "list3second"),new Category(3, 1001, "list3third"),new Category(4, 1001, "list3"));

//returns true only if you override hashCode() and equals() otherwise you will get false
        System.out.println("list1==list2 : "+Arrays.deepEquals(list1.toArray(), list2.toArray()));

        System.out.println("list1==list3 : "+Arrays.deepEquals(list1.toArray(), list3.toArray()));      


output
--------
list1==list2 : true
list1==list3 : false