2016-08-10 1 views
0

Je ne comprends pas pourquoi cette fonction ne supprime pas les chaînes en double de la liste.Supprimer les chaînes en double de la liste d'exécution

private void detectApps() { 
    //TODO: here set the running apps list to the Adapter 
    m_processesList =AndroidProcesses.getRunningAppProcesses(); 
    Set<AndroidAppProcess> set= new HashSet<>(); 
    set.addAll(m_processesList); 
    m_processesList.clear(); 
    m_processesList.addAll(set); 
    runningAppsAdapter=new AppsAdapter(RunningAppsActivity.this,R.layout.list_item,m_processesList); 
    m_listView.setAdapter(runningAppsAdapter); 
    runningAppsAdapter.notifyDataSetChanged(); 
} 

Répondre

1

pourquoi cette fonction ne supprime pas les chaînes en double de la liste?

Parce que vous n'êtes pas traiter String s, vous avez affaire à AndroidAppProcess et si vous voyez le structure of this class:

public class AndroidAppProcess extends AndroidProcess { 

    private static final boolean SYS_SUPPORTS_SCHEDGROUPS = new File("/dev/cpuctl/tasks").exists(); 

    /** {@code true} if the process is in the foreground */ 
    public final boolean foreground; 

    /** The user id of this process. */ 
    public final int uid; 
    ... 

vous pouvez voir que chaque processus android est attribué un identifiant unique. Maintenant, les possibilités sont que tous les processus de votre liste sont uniques. Donc, quand vous les convertissez en Set il n'y a pas de doublon et donc rien n'est supprimé.

Toutefois, si vous auriez eu affaire à String pur, alors définitivement les doublons seraient supprimés, comme indiqué dans this réponse.


Méthode 1

Comme mentionné dans this réponse, A HashSet utilise une mise en oeuvre Map, qui à son tour, utilise hashCode() et equals() pour éviter les doublons.

Une façon de résoudre le problème est de passer outre hashCode() et equals() dans la classe AndroidAppProcess, de sorte qu'il représente vos equals() critères

Par exemple:

public class AndroidAppProcess extends AndroidProcess { 
    ... 
    ... 

    @Override 
    public boolean equals(Object o) { 
     //return <write a logic that compare this AndroidAppProcess with another AndroidAppProcess. 
    } 


    @Override 
    public int hashCode() { 
     //return <this androidProcess name>.hashCode(); 
    } 

} 

Méthode 2

Vous pouvez utiliser un TreeSet au lieu de HashSet avec un comparateur personnalisé qui compare les tableaux de chaînes pour l'égalité.

private void detectApps() { 
    //TODO: here set the running apps list to the Adapter 
    m_processesList =AndroidProcesses.getRunningAppProcesses(); 

    //use TreeSet instead of HashSet 
    Set<AndroidAppProcess> set= new TreeSet<>(new Comparator<AndroidAppProcess>() { 
     @Override 
     public int compare(AndroidAppProcess o1, AndroidAppProcess o2) { 
     return /* Write a code that compares two AndroidAppProcess 
     For example you can write: 

     return o1.getPackageName() == o2.getPackageName(); 

     P.S.: I'm not sure as what's the method to get the correct name, 
     but you get the idea so you can search the library to get the correct name. 
     */ 
     } 
    }); 

    set.addAll(m_processesList); 
    m_processesList.clear(); 
    m_processesList.addAll(set); 
    runningAppsAdapter=new AppsAdapter(RunningAppsActivity.this,R.layout.list_item,m_processesList); 
    m_listView.setAdapter(runningAppsAdapter); 
    runningAppsAdapter.notifyDataSetChanged(); 
} 
+0

Merci de me rappeler que .... pouvez-vous me dire comment obtenir la liste requise – sam

+0

@sam Voir la réponse éditée pour Plus d'informations. –

+0

J'ai ajouté ces followings mais après avoir comparé, il ne retourne que le nom du paquet unique – sam

0

Voici votre HashSet est une liste de AndroidAppProcess et bien que les valeurs des variables d'instance de plusieurs de ses objets seront identiques, les objets sont différents. Par conséquent, les doublons ne sont pas supprimés. Vous devriez plutôt essayer d'utiliser un ensemble de chaînes, puis les dupicates seront retirés

+0

comment puis-je faire cela ..... – sam