【问题标题】:Compare two list objects比较两个列表对象
【发布时间】:2017-05-17 04:57:20
【问题描述】:

我有两个列表如下:

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='first',catId=17}

但是当 id 为 null 时如何得到 {id=3,catTitle='first',catId=17} 作为结果?!!!

【问题讨论】:

  • categoriesid==null 时,你想要selectCategories 列表中的第一项吗?
  • 是的。因为 selectedCategories 从数据库加载
  • 您是否有任何现有代码适用于id==null 以外的情况?
  • 其实我想比较两个列表后得到共同的对象
  • 普通是什么意思?在您的情况下,一个对象的 id 为 null,而另一个对象的 id 为 3。它们并不常见....

标签: java android list compare contains


【解决方案1】:
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);
   } 

}

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

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

获取常用元素:

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

【讨论】:

  • 你能解释一下在比较列表时使用这些方法吗?
  • 列表中的元素使用 equals() 函数进行比较,该函数存在于任何对象中(参见 Java Object 类的定义:docs.oracle.com/javase/7/docs/api/java/lang/Object.html)。通过覆盖 'equals',即使 id-s 不完全匹配,我们也可以让项目被视为相等。
【解决方案2】:

如果你使用Model类那么你需要手动匹配

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

List<String> categories;

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

【讨论】:

  • ~"那么你很容易匹配记录"是什么意思?您能否在答案中给出代码说明。
【解决方案3】:

我是用这个方法做的,希望对你有帮助!

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


        }

【讨论】:

    【解决方案4】:

    您可以使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多