これがここで何度も議論されていることは知っていますが、私が試した例はどれもうまくいきませんでした.
私が持っているもの
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);