-4

クラスでArrayListあるタイプの重複を削除したい。AlertsAlerts

クラスアラート -

public class Alerts implements Parcelable {
    String date = null;
    String alertType = null;
    String discription = null;

    public Alerts() {

    }

    public Alerts(String date, String alertType, String discription) {
        super();
        this.date = date;
        this.alertType = alertType;
        this.discription = discription;
    }
}

要素を追加する方法は次のとおりです-

ArrayList<Alerts> alert = new ArrayList<Alerts>();
Alerts obAlerts = new Alerts();

obAlerts = new Alerts();
obAlerts.date = Date1.toString();
obAlerts.alertType = "Alert Type 1";
obAlerts.discription = "Some Text";
alert.add(obAlerts);

obAlerts = new Alerts();
obAlerts.date = Date2.toString();
obAlerts.alertType = "Alert Type 1";
obAlerts.discription = "Some Text";
alert.add(obAlerts);

それらから私が取り除きたいもの-

obAlerts.date一意のとを持つすべてのアラートが必要ですobAlerts.alertType。つまり、重複obAlerts.dateobAlerts.alertTypeアラートを削除します。

私はこれを試しました -

Alerts temp1, temp2;
String macTemp1, macTemp2, macDate1, macDate2;

for(int i=0;i<alert.size();i++)
 {    
    temp1 = alert.get(i);  
    macTemp1=temp1.alertType.trim(); 
    macDate1 = temp1.date.trim();

    for(int j=i+1;j<alert.size();j++)
    {

         temp2 = alert.get(j);  
        macTemp2=temp2.alertType.trim();  
        macDate2 = temp2.date.trim();

        if (macTemp2.equals(macTemp1) && macDate1.equals(macDate2))  
        {   
           alert.remove(temp2);           
        } 

    }
 }

私も試してみました-

HashSet<Alerts> hs = new HashSet<Alerts>();
hs.addAll(obAlerts);
obAlerts.clear();
obAlerts.addAll(hs);
4

4 に答える 4

2

を使用できますSet<>。本質的に、セットには重複は含まれません。hashCode()適切なandequals()メソッドがあることを確認する必要があるだけです。

于 2014-06-18T12:41:12.647 に答える
1

Alertsクラスで、hashCodeおよびメソッドをオーバーライドしてequals、主キーにするフィールドの値に依存するようにします。その後、HashSetを反復処理しながら、 を使用して既に表示されているインスタンスを格納できますArrayList。にないインスタンスを見つけたらHashSetに追加しHashSet、そうでない場合は から削除しArrayListます。生活を楽にするために、HashSet完全にに切り替えて、重複自体で完了することができます。

hashCodeandをオーバーライドする場合equalsいくつかの制約が適用されることに注意してください。

このスレッドhashCodeには、適切な関数を作成する方法に関する役立つヒントがいくつかあります。重要な教訓は、すべての従属フィールドのハッシュコードを単純に追加するだけでは十分ではないということです。フィールド間で値を交換すると、望ましくない同一の hashCode が発生する可能性があるためです (姓と名の交換を比較してください)。代わりに、通常、次のアトミック ハッシュを追加する前に、ある種のシフト操作が行われます。素数で乗算します。

于 2014-06-18T12:42:20.957 に答える
-1

最初にデータを配列に保存し、次に 1 つずつ文字列として分割し、そのデータの長さまで arry を実行し、if 条件によって実際のデータと比較して、それを返します。

HashSet<String> hs = new HashSet<String>(); 

for(int i=0;i<alert.size();i++)
{
    hs.add(alert.get(i).date + ","+ alert.get(i).alertType;
}

alert.clear();

String alertAll[] = null;
for (String s : hs) {   

    alertAll = s.split(",");
    obAlerts = new Alerts();
    obAlerts.date = alertAll[0];
    obAlerts.alertType = alertAll[1];
    alert.add(obAlerts);
}
于 2014-06-18T12:38:47.040 に答える