0

シナリオ:アプリケーションの詳細を含む 2 つのアレイ リストがあります。1 つの ArrayList にはすべてのアプリケーションのコレクションがあり、2 番目の ArrayList には選択されたアプリケーションのコレクションがあります。そして、選択したアプリケーションをすべてのアプリケーション リストから削除する必要があります。このために、ArrayList.removeAll 関数を使用しました。

問題 : ArrayList.removeAll は完全に正常に動作していますが、1 つの問題は、選択したアプリケーション配列リストに同じ名前の 2 つのアプリから 1 つのアプリケーションがある場合です (ただし、他のプロパティは異なります)。AngryBirds... リストから両方のアプリを削除します。

私はこのように使用しています:

  mInstalledApplicationList = new ArrayList<App>();

        mInstalledApplicationList.addAll(ApplicationList.mInstalledAppList);
        Log.e(TAG, "Total Installed App Size : " + ApplicationList.mInstalledAppList.size());

        mInstalledApplicationList.removeAll(ApplicationList.mSelecteddAppList);
        Log.e(TAG, "Filtered Installed App Size : " + mInstalledApplicationList.size());

私のAPPコレクションクラスは次のとおりです。

import java.util.Comparator;
import java.util.List;

import android.content.ComponentName;
import android.content.Intent;
import android.graphics.drawable.Drawable;

public class App implements Comparable<App> {

    private String title;

    private String packageName;

    private String versionName;

    private int versionCode;

    private String app_class;

    private String installDate;

    private int installDateMilli;

    private List<String> appPermissions;

    private Drawable mIcon;

    public Intent intent;

    // ordinary getters and setters

    public Drawable getmIcon() {
        return mIcon;
    }

    public void setmIcon(Drawable mIcon) {
        this.mIcon = mIcon;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getDateMilli() {
        return installDateMilli;
    }

    public void setDateMilli(int DateMilli) {
        this.installDateMilli = DateMilli;
    }

    public List<String> getAppPermissions() {
        return appPermissions;
    }

    public void setAppPermissions(String appPermission) {
        this.appPermissions.add(appPermission);
    }

    public String getInstallDate() {
        return installDate;
    }

    public void setInstallDate(String installDate) {
        this.installDate = installDate;
    }

    public String getPackageName() {
        return packageName;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }

    public String getVersionName() {
        return versionName;
    }

    public void setVersionName(String versionName) {
        this.versionName = versionName;
    }

    public int getVersionCode() {
        return versionCode;
    }

    public void setVersionCode(int versionCode) {
        this.versionCode = versionCode;
    }

    public String getAppClass() {
        return app_class;
    }

    public void setAppClass(String app_class) {
        this.app_class = app_class;
    }

    final void setActivity(ComponentName className, int launchFlags) {
        intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        intent.setComponent(className);
        intent.setFlags(launchFlags);
    }

    @Override
    public int compareTo(App app) {

        return 0;
    }

    public static Comparator<App> AppNameComparator = new Comparator<App>() {

        public int compare(App app1, App app2) {

            String AppName1 = app1.getTitle().toUpperCase();
            String AppName2 = app2.getTitle().toUpperCase();

            // ascending order
            return AppName1.compareTo(AppName2);

            // descending order
            // return fruitName2.compareTo(fruitName1);
        }

    };

    public static Comparator<App> AppDateComparator = new Comparator<App>() {

        public int compare(App app1, App app2) {

            int AppName1 = 0;
            int AppName2 = 0;

            AppName1 = app1.installDateMilli;
            AppName2 = app2.installDateMilli;

            return AppName2 - AppName1;

        }

    };

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof App)) {
            return false;
        }

        App that = (App) o;
        return title.equals(that.title)
                && intent.getComponent().getClassName()
                        .equals(that.intent.getComponent().getClassName());
    }

    @Override
    public int hashCode() {
        int result;
        result = (title != null ? title.hashCode() : 0);
        final String name = intent.getComponent().getClassName();
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }
}

** App クラスを更新しました。これは私の App クラスです**

解決

次のように equals および hashCode メソッドを変更することで問題を解決しました。

@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (!(o instanceof App)) {
        return false;
    }

    App that = (App)o;
    return title.equals(that.title) && intent.getComponent().getClassName().equals(that.intent.getComponent().getClassName()) && packageName.equals(that.packageName);
}

@Override
public int hashCode() {
    int result;
    result = (title != null ? title.hashCode() : 0);
    final String name = intent.getComponent().getClassName();
    int pkg_code = (packageName != null ? packageName.hashCode() : 0);
    result = 31 * result + pkg_code + (name != null ? name.hashCode() : 0);
    return result;
}

助けてくれてありがとう。

4

1 に答える 1

2

equalsクラスのメソッドをApp適切に実装する必要があります。おそらく最良の解決策は、アプリの一意の識別子として packageName を使用することです。

@Override
public boolean equals(Object o) {

    if (o == this) {
        return true;
    }

    if (!(o instanceof App)) {
        return false;
    }

    App app = (App)o;
    return TextUtils.equals(app.packageName, this.packageName);

}
于 2013-03-07T07:36:03.337 に答える