java - Java Set 接受重复的 String[] 吗?

标签 java android set

在我的 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/

相关文章:

java - 我们如何获得该谷歌地图 v2 中所有路线节点的音轨

android - 数据库在我的应用程序下载后似乎消失了。想法?

Python设置: "empty" element,输入不正确

arrays - Scala:将数组放入 Set 或 Map 的轻量级方法

java - 退出应用程序时禁用 VPN

java - Java 的自动映射器

java - 有没有办法注入(inject)一个依赖项,该依赖项将根据注入(inject)的位置(使用 Spring 引导)使用特定的 bean?

android - Google cardboard for unity 在 Android 设备上禁用 AA

Javascript:将某些信息推送到数组并从数组中获取信息

javascript - 如何从 zul ZK 中的 Controller 获取 json 对象?