9

これがここで何度も議論されていることは知っていますが、私が試した例はどれもうまくいきませんでした.

私が持っているもの

Android から通話ログにアクセスし、発信されたすべての通話のリストを取得します。もちろん、ここでは多くの重複があります。まずリストを作ります

List<ContactObject> lstContacts = new ArrayList<ContactObject>();

次に、オブジェクトを追加します

While (get some record in call log)
{
    ContactObject contact = new ContactObject();
    contact.SetAllProperties(......)  
    lstContacts.add(contact);  
}

Set<ContactObject> unique = new LinkedHashSet<ContactObject>(lstContacts);
lstContacts = new ArrayList<ContactObject>(unique);

Contact オブジェクト クラスは単純です

public class ContactObject {

    public ContactObject() {
        super();
    }

 @Override
 public boolean equals(Object obj) {
     if (!(obj instanceof ContactObject))
        return false;

     return this.lstPhones == ((ContactObject) obj).getLstPhones(); 
 }

 @Override
 public int hashCode() {
     return lstPhones.hashCode();
 }

    private long Id;
    private String name;
    private List<String> lstPhones;  
    private String details;

   //... getters and settres
}

必要なもの

リストに一度だけ連絡先が必要です。私がここで読んだように、Set、HashSet、TreeSet のように実行できることがいくつかあります。TreeSet は、呼び出しログから受け取った順序を保持するため、最高のようです。コードをそれで動作させようとしましたが、成功しませんでした。私の例に基づいたサンプルコードを教えてください。お時間をいただきありがとうございます。

実用的なソリューション。ご支援いただきありがとうございます、あなたは私の一日を作りました.

ContactObject では、2 つのメソッドをオーバーライドします

 @Override
     public boolean equals(Object obj) {
         if (!(obj instanceof ContactObject))
            return false;

         return lstPhones.equals(((ContactObject) obj).getLstPhones());
     }

     @Override
     public int hashCode() {
         return (lstPhones == null) ? 0 : lstPhones.hashCode();
     }

//ゲッターとセッターとコンストラクター....

単純に次のように使用します

Set<ContactObject> unique = new LinkedHashSet<ContactObject>(lstContacts);
lstContacts = new ArrayList<ContactObject>(unique);
4

5 に答える 5

8

あなたのケースでは、挿入順序を保持するLinkedHashSetを使用できます。

HashSet: 順不同。

TreeSet: ソートされたセットですが、挿入順序は保持されません。

EDIT:Software Monkeyがコメントしたように、ハッシュベースのセットに合わせて上書きする必要がありますhashCode()equals()ContactObject

于 2011-07-16T07:09:11.127 に答える
7

カスタム オブジェクトの重複を削除

Comparator を使用して重複を削除する例

クラス「連絡先」があるとしましょう

public class Contact implements Comparable<Contact> {


public String getName() {
    return this.Name;
}

public void setName(String name) {
    this.Name = name;
}

public String getNumber() {
    return this.Number;
}

public void setNumber(String number) {
    this.Number = number;
}


 ///// this method is very important you must have to implement it.
@Override
public String toString() {
    return "\n" +"Name=" + name + "   Number=" + Number;
}

Setを使用して重複するエントリを削除する方法は次のとおりです。リストを関数に渡すだけで機能します。連絡先が重複していない新しいリストが返されます。

 public ArrayList<Contact>  removeDuplicates(ArrayList<Contact> list){
    Set<Contact> set = new TreeSet(new Comparator<Contact>() {

        @Override
        public int compare(Contact o1, Contact o2) {
            if(o1.getNumber().equalsIgnoreCase(o2.getNumber())){
                return 0;
            }
            return 1;
        }
    });
    set.addAll(list);

    final ArrayList newList = new ArrayList(set);
    return newList;
}

それは私のために働いたので、試してみて、フィードバックをお寄せください。ありがとう

PS:この記事のクレジットは Nilanchala にあります。

于 2016-10-25T14:13:01.577 に答える
3

確かに TreeSet を使用して 1 回だけ保存できますが、よくある間違いは hashCode() および equal() メソッドをオーバーライドしないことです。

これはあなたにぴったりです:

 public boolean equals(Object obj) {
     if (!(obj instanceof ContactObject))
        return false;

     return this.id == ((ContactObject) obj).getId(); // you need to refine this
 }

 public int hashCode() {
     return name.hashCode();
 }
于 2011-07-16T07:14:46.483 に答える
2
List<ContactObject> listContacts = new ArrayList<ContactObject>();
//populate...

//LinkedHashSet preserves the order of the original list
Set<ContactObject> unique = new LinkedHasgSet<ContactObject>(listContacts);
listContacts = new ArrayList<ContactOjbect>(unique);
于 2011-07-16T07:09:27.897 に答える
1

代わりにセットを使用してください。

セットは数学コレクションとして機能するため、要素の重複は許可されません。

そのため、新しい要素を追加するたびに、各要素の等式と.equals()メソッドがチェックされます。

于 2011-07-18T12:48:08.423 に答える