我有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
答案 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()以某种方式识别联系人是否与另一个联系人使用电话号码作为标准...
但您只需使用电话号码
作为条件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;
}
}
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()