在我的 Android 应用程序中,我使用查询来获取手机中的所有联系人。我知道这可能会导致重复的元素,因此我使用 LinkedHashSet
来处理它:
private void retrieveContacts(ContentResolver contentResolver) {
LinkedHashSet<String[]> contactSet = new LinkedHashSet<String[]>();
final Cursor cursor = contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
new String[] {
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER }, null,
null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
if (cursor == null);
if (cursor.moveToFirst() == true) {
do {
final String name = cursor
.getString(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
final String telephone = cursor
.getString(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)).replace(" ", "").replace("+336", "06");
String[] contactString = {telephone, name};
contactSet.add(contactString);
} while (cursor.moveToNext() == true);
}
if (cursor.isClosed() == false) {
cursor.close();
}
for (String[] contactString : contactSet){
Contact contact = new Contact(contactString[0], contactString[1], false, false);
daocontact.add(contact);
}
Contact
是我使用的代表联系人的 Bean,daocontact 是一个将联系人存储在数据库中的 DAO。问题是,看起来 Set 实际上存储了重复的元素,因为当我根据数据库的记录显示 ListView 时,它显示了很多重复的元素。
为什么Set
接受重复元素?如何解决这个问题?
最佳答案
使用 LinkedHashSet<String[]>
作为 LinkedHashSet
不是一个好主意通过调用 equals
检查重复项,而equals()
对于 String[]
只是使用==
。这意味着new String[] {"12345", "Joe"}
和new String[] {"12345", "Joe"}
不被视为平等。
相反,您应该定义一个名为 Contact
的类如下:
public final class Contact {
private final String number;
private final String name;
public Contact(String number, String name) {
this.number = number;
this.name = name;
}
public String number() { return number; }
public String name() { return name; }
@Override
public boolean equals(Object object) {
if (object == this)
return true;
if (!(object instanceof Contact))
return false;
Contact that = (Contact) object;
return that.number.equals(number) && that.name.equals(name);
}
@Override
public int hashCode() {
return number.hashCode() ^ name.hashCode();
}
}
然后您将能够使用LinkedHashSet<Contact>
.
关于java - Java Set 接受重复的 String[] 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29197957/