2 ArrayList中的常见对象

时间:2016-06-10 16:18:43

标签: java android arraylist

我有2 start = new JButton("Start Menu"); start.setForeground(Color.WHITE); ImageIcon ii = new ImageIcon("C:\\Users\\Bobby\\Desktop\\Ocean.jpg"); int scale = 1; int width = ii.getIconWidth(); int newWidth = width / scale; start.setIcon(new ImageIcon(ii.getImage().getScaledInstance(newWidth, -1, java.awt.Image.SCALE_SMOOTH))); 。我希望元素具有共同的ArrayList

phone

我使用下面的方法来获取常见元素:

ArrayList<Contact> phone_contacts;
ArrayList<Contact> registered_users;

但是,我得到的结果是空的。如何在ArrayList<Contact> common_contacts = new ArrayList<Contact>(phone_contacts); common_contacts.retainAll(registered_users); ArrayList中获得常用电话联系?

common_contacts

3 个答案:

答案 0 :(得分:2)

首先,如果您将电话号码视为标识符,我建议您谨慎行事。 Falsehoods Programmers Believe About Phone Numbers

据说......

retainAll最终使用equals方法。假设您有一个自定义对象(而不是像定义的equals那样的String或int),最简单的方法是为equals定义一个返回true的Contact方法如果两者有相同的电话号码。

然而,这可能不是你想要的。例如,equals可能需要在其他上下文中检查名称。

您可以采取其他几种方法。自从你提到Android以来,Java 8流目前已经出来了。 Iterator循环可以完成这项工作。将注册用户的所有电话号码收集到Set(这样您就拥有唯一列表),然后从所有联系人List开始,删除任何不具备的联系人该套电话号码。

Set<String> registeredPhoneNumbers = new HashSet<>();
for (Contact c : registered_users) {
  registeredPhoneNumbers.add(c.getPhone());
}
List<Contact> common_contacts = new ArrayList<>(phone_contacts);
for (Iterator<Contact> iter = common_contacts.iterator(); iter.hasNext();) {
  Contact c = iter.next();
  if (!registeredPhoneNumbers.contains(c.getPhone())) {
    iter.remove();
  }
}

由于您在评论中提到可能有一百万个不同的registered_users,这可能更节省空间:

Set<String> phoneNumbers = new HashSet<>();
for (Contact c : phone_contacts) {
    phoneNumbers.add(c.getPhone());
}

Set<String> overlappingNumbers = new HashSet<>();
for (Contact registered : registered_users) {
    if (phoneNumbers.contains(registered.getPhone())) {
        overlappingNumbers.add(registered.getPhone());
    }
}
List<Contact> common_contacts = new ArrayList<>();
for (Contact contact : phone_contacts) {
    if (overlappingNumbers.contains(contact.getPhone())) {
      common_contacts.add(contact);
    }
  }
}

您可能还想检查电话号码是否为空。

答案 1 :(得分:0)

如果您使用列表中的方法RetainAll,您将获得2个列表之间的公共对象.. \

实施例

考虑整数列表,(仅为了示例)它将适用于您的班级......

public static void main(String[] args) {
    List<Integer> list1 = new ArrayList<Integer>(Arrays.asList(0, 1, 2, 3, 4, 5));
    List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(1, 3, 5));
    List<Integer> list3 = new ArrayList<Integer>(list1);
    list3.retainAll(list2);
    System.out.println("List1:" + list1);
    System.out.println("List2:" + list2);
    System.out.println("List common:" + list3);

    }

在您的情况下,需要修改类联系人,以便Method ArrayLst.retainAll()以某种方式识别联系人是否与另一个联系人使用电话号码作为标准...

通过添加 HashCode 等于来修改/改进联系人类:

但您只需使用电话号码

作为条件
public class Contact {
    private String name;
    private int phone;

    public Contact(String name, int phone) {
    this.name = name;
    this.phone = phone;
    }

    public String getName() {
    return name;
    }

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

    @Override
    public String toString() {
    return "Contact [name=" + name + ", phone=" + phone + "]";
    }

    @Override
    public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + phone;
    return result;
    }

    @Override
    public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Contact other = (Contact) obj;
    if (phone != other.phone)
        return false;
    return true;
    }

    public int getPhone() {
    return phone;
    }

    public void setPhone(int phone) {
    this.phone = phone;
    }
}

实施联系人列表并调用方法RetainAll

   public static void main(String[] args) {
    List<Contact> list1 = new ArrayList<Contact>(Arrays.asList(new Contact(UUID.randomUUID().toString(), 1),
        new Contact(UUID.randomUUID().toString(), 2), new Contact(UUID.randomUUID().toString(), 3),
        new Contact(UUID.randomUUID().toString(), 4), new Contact(UUID.randomUUID().toString(), 5)));
    List<Contact> list2 = new ArrayList<Contact>(Arrays.asList(new Contact(UUID.randomUUID().toString(), 1),
        new Contact(UUID.randomUUID().toString(), 3), new Contact(UUID.randomUUID().toString(), 5)));
    List<Contact> list3 = new ArrayList<Contact>(list1);
    list3.retainAll(list2);
    System.out.println("List1:" + list1);
    System.out.println("List2:" + list2);
    System.out.println("List common:" + list3);
    }

答案 2 :(得分:0)

将这些行添加到您的Contact类:

@Override
public boolean equals(Object obj) {
    return obj instanceof Contact &&
            this.name != null && this.name.equals(((Contact)obj).name) &&
            this.phone!= null && this.phone.equals(((Contact)obj).phone);
}

参考:https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-

另见:hashCode()