Java 2 ArrayList中的公共对象
我有2个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
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);
}