Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 2 ArrayList中的公共对象_Java_Android_Arraylist - Fatal编程技术网

Java 2 ArrayList中的公共对象

Java 2 ArrayList中的公共对象,java,android,arraylist,Java,Android,Arraylist,我有2个ArrayList。我想要带有公共电话的元素 ArrayList<Contact> phone_contacts; ArrayList<Contact> registered_users; 如果使用列表中的方法,将获得两个列表之间的公共对象\ 例子: 考虑整数列表(仅为了示例),它将与您的类一起工作 public static void main(String[] args) { List<Integer> list1 = new Array

我有2个
ArrayList
。我想要带有公共
电话
的元素

ArrayList<Contact> phone_contacts;
ArrayList<Contact> registered_users;
如果使用列表中的方法,将获得两个列表之间的公共对象\

例子: 考虑整数列表(仅为了示例),它将与您的类一起工作

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

    }
实现联系人列表并调用retainal方法
publicstaticvoidmain(字符串[]args){
List list1=new ArrayList(Arrays.asList)(新联系人(UUID.randomUUID().toString(),1),
新联系人(UUID.randomUUID().toString(),2),新联系人(UUID.randomUUID().toString(),3),
新联系人(UUID.randomUUID().toString(),4),新联系人(UUID.randomUUID().toString(),5));
List list2=新的ArrayList(Arrays.asList)(新联系人(UUID.randomUUID().toString(),1),
新联系人(UUID.randomUUID().toString(),3),新联系人(UUID.randomUUID().toString(),5));
List list3=新的数组列表(list1);
清单3.保留(清单2);
System.out.println(“List1:+List1”);
System.out.println(“List2:+List2”);
System.out.println(“列表公用:+list3”);
}
如果使用列表中的方法,您将获得两个列表之间的公共对象\

例子: 考虑整数列表(仅为了示例),它将与您的类一起工作

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

    }
实现联系人列表并调用retainal方法
publicstaticvoidmain(字符串[]args){
List list1=new ArrayList(Arrays.asList)(新联系人(UUID.randomUUID().toString(),1),
新联系人(UUID.randomUUID().toString(),2),新联系人(UUID.randomUUID().toString(),3),
新联系人(UUID.randomUUID().toString(),4),新联系人(UUID.randomUUID().toString(),5));
List list2=新的ArrayList(Arrays.asList)(新联系人(UUID.randomUUID().toString(),1),
新联系人(UUID.randomUUID().toString(),3),新联系人(UUID.randomUUID().toString(),5));
List list3=新的数组列表(list1);
清单3.保留(清单2);
System.out.println(“List1:+List1”);
System.out.println(“List2:+List2”);
System.out.println(“列表公用:+list3”);
}

首先,如果您将电话号码视为标识符,我建议您小心

话虽如此

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

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

你还可以采取一些其他的方法。因为你提到了Android,Java8流目前已经过时了。一个
迭代器
循环可以完成这项工作。将注册用户的所有电话号码收集到
集合
(这样您就有了唯一的列表),然后从所有联系人的
列表开始,并从该集合中删除任何没有电话号码的联系人

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();
  }
}
Set registeredPhoneNumbers=new HashSet();
对于(联系人c:注册用户){
registeredPhoneNumbers.add(c.getPhone());
}
列出常用联系人=新阵列列表(电话联系人);
for(迭代器iter=common_contacts.Iterator();iter.hasNext();){
触点c=iter.next();
如果(!registeredPhoneNumbers.contains(c.getPhone())){
iter.remove();
}
}
由于您在评论中提到可能有一百万个不同的注册用户,这可能更节省空间:

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);
    }
  }
}
Set phoneNumbers=new HashSet();
用于(联系人c:电话\ U联系人){
添加(c.getPhone());
}
Set overlappingNumbers=new HashSet();
for(联系人注册:注册用户){
if(phoneNumbers.contains(registed.getPhone())){
overlappingNumbers.add(registed.getPhone());
}
}
列出常见联系人=新建ArrayList();
用于(联系人:电话\ U联系人){
if(overlappingNumbers.contains(contact.getPhone())){
常用联系人。添加(联系人);
}
}
}

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

首先,如果您将电话号码视为标识符,我建议您小心

话虽如此

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

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

你还可以采取一些其他的方法。因为你提到了Android,Java8流目前已经过时了。一个
迭代器
循环可以完成这项工作。将注册用户的所有电话号码收集到
集合
(这样您就有了唯一的列表),然后从所有联系人的
列表开始,并从该集合中删除任何没有电话号码的联系人

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();
  }
}
Set registeredPhoneNumbers=new HashSet();
对于(联系人c:注册用户){
registeredPhoneNumbers.add(c.getPhone());
}
列出常用联系人=新阵列列表(电话联系人);
for(迭代器iter=common_contacts.Iterator();iter.hasNext();){
触点c=iter.next();
如果(!registeredPhoneNumbers.contains(c.getPhone())){
iter.remove();
}
}
由于您在评论中提到可能有一百万个不同的注册用户,这可能更节省空间:

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);
    }
  }
}
Set phoneNumbers=new HashSet();
用于(联系人c:电话\ U联系人){
添加(c.getPhone());
}
Set overlappingNumbers=new HashSet();
for(联系人注册:注册用户){
if(phoneNumbers.contains)(registed.g
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);
    }
  }
}
@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);
}