Java集合是否接受重复的字符串[]?
在我的Android应用程序中,我使用查询获取手机中的所有联系人。我知道这可能会导致重复元素,因此我使用Java集合是否接受重复的字符串[]?,java,android,set,Java,Android,Set,在我的Android应用程序中,我使用查询获取手机中的所有联系人。我知道这可能会导致重复元素,因此我使用LinkedHashSet来处理它: private void retrieveContacts(ContentResolver contentResolver) { LinkedHashSet<String[]> contactSet = new LinkedHashSet<String[]>(); final Cursor cursor = cont
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);
}
private void retrieveContacts(ContentResolver ContentResolver){
LinkedHashSet contactSet=新LinkedHashSet();
最终游标=contentResolver.query(
ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,
新字符串[]{
Contacts contract.CommonDataTypes.Phone.DISPLAY\u NAME,
ContactsContract.CommonDataTypes.Phone.NUMBER},空,
空,ContactsContract.CommonDataTypes.Phone.DISPLAY_NAME+“ASC”);
如果(游标==null);
if(cursor.moveToFirst()==true){
做{
最终字符串名=游标
.getString(游标
.getColumnIndex(ContactsContract.CommonDataTypes.Phone.DISPLAY_NAME));
最终字符串电话=光标
.getString(游标
.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER)).replace(“,”).replace(“+336”,“06”);
String[]contactString={电话,姓名};
contactSet.add(contactString);
}while(cursor.moveToNext()==true);
}
if(cursor.isClosed()==false){
cursor.close();
}
对于(字符串[]contactString:contactSet){
联系人=新联系人(联系人字符串[0],联系人字符串[1],假,假);
daoscontact.add(contact);
}
Contact
是我使用的表示联系人的Bean,而daoscontact是将联系人存储在数据库中的DAO。问题是,该集合似乎实际存储了重复的元素,因为当我根据数据库记录显示ListView时,它会显示大量重复的元素
为什么
集合
接受重复的元素?如何解决此问题?字符串[]没有hashCode()
和等于LinkedHashSet
期望保持唯一性的语义
要快速修复,请尝试使用ArrayList
而不是String[]
,后者确实定义了这些方法
编辑-您可以使用以下习惯用法而不是moveToFirst
,简化对光标结果的迭代:
while (cursor.moveToNext()) {
// .. use the cursor
}
这是因为游标语义保证游标将被放置在第一个结果(如果有)的正前方,并且如果没有下一个要移动到的行的值,将返回false。String[]没有hashCode()
和等于LinkedHashSet
期望保持唯一性的语义
要快速修复,请尝试使用ArrayList
而不是String[]
,后者确实定义了这些方法
编辑-您可以使用以下习惯用法而不是moveToFirst
,简化对光标结果的迭代:
while (cursor.moveToNext()) {
// .. use the cursor
}
这是因为游标语义保证游标将被放置在第一个结果(如果有的话)的正前方,如果没有下一个要移动到的行值,则返回false。使用LinkedHashSet
不是一个好主意,因为LinkedHashSet
通过调用equals
检查重复项,而equalsls()
对于字符串[]
只使用=
。这意味着新字符串[]{“12345”,“Joe”}
和新字符串[]{“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
使用LinkedHashSet
不是一个好主意,因为LinkedHashSet
通过调用equals
检查重复项,而equals()
用于字符串[]
的只是使用=
。这意味着新字符串[]{12345”,“Joe}
和新字符串[]{“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
“为什么集合接受重复的元素?”--它们不是重复的。它们是独立的对象。“如何解决这个问题?”--编写自己的Java类,将两个字符串对象作为数据成员,并实现equals()
和hashCode()
正如您在该类上看到的那样。“为什么集合接受重复的元素?”--它们不是重复的。它们是独立的对象。“如何解决这个问题?”--编写自己的Java类,将两个String
对象作为数据成员,并实现equals()
和hashCode()
正如您在该类中看到的那样。此解决方案有效,使我能够在集合中直接操作联系人Bean。谢谢you@Kritias非常小心。我故意没有给联系人
设置名称
或设置编号
方法。如果您更改名称
或编号
,则哈希代码
将更改后,您将无法再在集合中找到联系人
。感谢您提醒我,我会小心的。此解决方案有效,使我能够在集合中直接操作联系人Bean。谢谢you@Kritias非常小心。我故意没有给联系人
setName
或>setNumber
方法。如果您更改名称
或编号
,则哈希代码
将更改,您将无法再在集中找到联系人
。感谢您提醒我这一点,我会小心的。此解决方案非常有效,但我更喜欢pbabcdefp。@Kritia很公平。@,我也喜欢这个解决方案:)这个解决方案非常有效,但我更喜欢pbabcdefp的解决方案。@Kritia很公平,我也喜欢这个解决方案:)