【问题标题】:how to compare two arraylist<Contacts> in java如何在java中比较两个arraylist<Contacts>
【发布时间】:2014-11-10 04:13:01
【问题描述】:

我正在比较两个数组列表(Contacts .java 是一个 pojo 类)。第一个 Arraylist 包含一些项目,第二个 Arraylist 包含一些项目。通过比较两个列表,如果两个列表都包含相同的元素,则不应将其添加到第一个列表中,否则将其添加到第一个列表中。但我做不到。下面是我的代码。我们将不胜感激。

public void insertmanualandxmldata()
{
    mContacts = storage.getarraylist(); // Arraylist
    if(mContacts != null)
    {
        for(int i=0; i<mContacts.size(); i++)
        {
            ContactVO mShareddata = mContacts.get(i);
            //mParsedDataSetList arraylist
            for(int j=0; j<mParsedDataSetList.size(); j++)
            {
                ContactVO mXmldata = mParsedDataSetList.get(j);
                if(mShareddata.getNumber().contains(mXmldata.getNumber()))
                {
                    mContacts.add(mXmldata);
                }
            }
        }
        storage.savearraylist(mContacts);
    }
    else
    {
        storage.savearraylist(mParsedDataSetList);
    }
}

【问题讨论】:

  • 我知道。它使用字符串进行比较。但我正在使用 pojo 类,它不能像那样进行比较。如果你有任何想法,请分享。
  • 你想合并两个列表的数据而不重复值吗?
  • 您可以使用ArrayList.removeAll() 删除重复值:)

标签: java arraylist


【解决方案1】:
  1. 实现可比性

    private class ContactsVO implements Comparable<ContactsVO>{
    
    int number;
    
    @Override
    public int compareTo(ContactsVO that)
    {
        if (this.number> that.number)
            return 1;
        else if (this.number< that.number)
            return -1;
        else
            return 0;
    
    }
    
    }
    

还有你的逻辑.. 将列表 2 的内容添加到列表 1。添加时我们必须比较列表 1 是否已经包含该项目。

       for(int j=0; j < mParsedDataSetList.size(); j++)
        {
            ContactVO mXmldata = mParsedDataSetList.get(j);
            boolean exists = false;

            for(int i=0; i< mContacts.size(); i++)
            {
                ContactVO mShareddata = mContacts.get(i);

                if(mShareddata.comprareTo(mXmldata) == 0)
                {
                   exists = true;
                   break; 
                }
            }
            if(!exists)
            {
                mContacts.add(mXmldata);
            }
        }

【讨论】:

    【解决方案2】:

    您可以实现一个扩展 ArrayList 的类并像这样创建一个 Comparator:

    public static Comparator<T> Comp = new Comparator<T>(){
        public int compare(Type e1, Type e2){
            return (e1.getSomething().compareTo(e2.getSomething()));
        }
    };
    

    如果您以前从未使用过比较器,这里是一个很好的教程https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html

    比较器基本上做的是提供比较元素的标准。

    【讨论】:

      【解决方案3】:

      实现比较器或可比较有两种方法。
      对于您的要求,我建议您可以在您的 ContactVO 课程中implements Comparable。还有override compareTo method

      private class ContactsVO implements Comparable<ContactsVO> {
      
          private Integer number;
      
          // Remaining attributes and their getter setter.
      
          public Integer getNumber() {
              return number;
          }
      
          public void setNumber(Integer number) {
              this.number = number;
          }
      
          @Override
          public int compareTo(ContactsVO compareWith) {
              if (this.getNumber() > compareWith.getNumber())
                  return 1;
              else if (this.getNumber() < compareWith.getNumber())
                  return -1;
              else
                  return 0;
          }
      }
      

      如果比较属性(在我们的例子中是数字)实现了 Comparable 那么我们可以将 compareTo 方法重写为

      @Override
      public int compareTo(ContactsVO compareWith) {
          return this.getNumber().compareTo(compareWith.getNumber());
      }
      

      注意:Integer、String等一些基本数据类型实现了Comparable。

      【讨论】:

        【解决方案4】:

        这里contactList1contactList2是你的两个POJO类列表Contacts

        Set<Contacts> contactList3 = new HashSet<Contacts>(contactList1);
        
        contactList3.addAll(contactList2);
        ArrayList<Contacts> newList = new ArrayList<Contacts>(contactList3);
        
        System.out.println("New List :"+newList);
        

        【讨论】:

          【解决方案5】:

          尝试使用不允许重复的 LinkedHashSet:

          ArrayList arrayList1 = new ArrayList();
          ArrayList arrayList2 = new ArrayList();
          
          ArrayList arrayList3 = new ArrayList();
          arrayList3.addAll(arrayList1);
          arrayList3.addAll(arrayList2);
          
          HashSet hashSet = new HashSet();
          hashSet.addAll(arrayList3);
          arrayList3.clear();
          arrayList3.addAll(hashSet);
          

          注意:当您需要维护列表项的顺序时,请使用 LinkedHashSet 而不是 HashSet。

          【讨论】:

          • 我不要顺序,要删除重复
          • 请检查我更新的ans,如果您不需要订购,那么您只需使用HashSet。
          猜你喜欢
          • 1970-01-01
          • 2013-01-15
          • 2012-01-25
          • 2013-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多