Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.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集合是否接受重复的字符串[]?_Java_Android_Set - Fatal编程技术网

Java集合是否接受重复的字符串[]?

Java集合是否接受重复的字符串[]?,java,android,set,Java,Android,Set,在我的Android应用程序中,我使用查询获取手机中的所有联系人。我知道这可能会导致重复元素,因此我使用LinkedHashSet来处理它: private void retrieveContacts(ContentResolver contentResolver) { LinkedHashSet<String[]> contactSet = new LinkedHashSet<String[]>(); final Cursor cursor = cont

在我的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);
    }
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很公平,我也喜欢这个解决方案:)