2010-07-02 14 views
2

J'ai deux Arraylist RunningProcessListAllProcessList ses valeurs suivantes contiennent lesComment comparer deux valeurs Arraylist dans java?

RunningProcessList: 
    Receiver.jar 



AllProcessList: 
    Receiver.jar 
    Sender.jar 
    Timeout.jar 
    TimeourServer.jar 

AllProcessList arraylist contient les tous les processus java, RunningProcessList arraylist contient processus en cours d'exécution. Je veux comparer ces deux arraylist et je veux afficher Si le processus ne fonctionne pas. Par exemple comparer deux liste et vouloir afficher le processus suivant ne fonctionne pas. J'ai utilisé le code suivant, mais il ne fonctionne pas.

Object Result = null; 
for (int i = 0; i <AllProcessList.size(); i++) { 
    for (int j = 0; j < RunningProcessList.size(); j++) { 
     if(AllProcessList.get(i) != (RunningProcessList.get(j))) { 
      System.out.println( RunningProcessList.get(j))); 
      Result =RunningProcessList.get(j); 
     } 
     if(AllProcessList.get(i) != (RunningProcessList.get(j))) { 
      list3.add(Result); 
     } 
    } 
} 

Répondre

15

Jetez un oeil à la documentation List, ecpecially la méthode removeAll().

List result = new ArrayList(AllProcessList); 
result.removeAll(RunningProcessList); 

Vous pouvez ensuite itérer sur cette liste et appelez System.out.println si vous voulez, comme vous l'avez fait ci-dessus ... mais est-ce que vous voulez faire?

+1

Assurez-vous de créer une copie de la liste d'origine avant de supprimer des éléments de celui-ci. –

+0

Je crois que vous devrez peut-être modifier votre answer.it doit être result.removeAll (runningProcessList); – chedine

+0

C'est ok si vous n'êtes pas inquiet de big-O ... mais pour les grands jeux de données cette solution est peu pratique car elle est O (n^2) –

0

En fonction du type de AllProcessList et RunningProcessList (whocu devrait être allProcessList et runningProcessList à suivre les conventions de nommage Java) ce qui suit ne fonctionnera pas:

if (AllProcessList.get(i) != (RunningProcessList.get(j))) { 

vous devez le remplacer par

if (!(AllProcessList.get(i).equals(RunningProcessList.get(j)))) { 

! = Compare l'égalité physique, les deux choses sont exactement le même "nouvel" objet ed? .equals (Object) a comparé l'égalité locaical, mangé les deux choses le "même"?

Pour ce faire, vous devrez remplacer les méthodes equals et hashCode. Voici un article à ce sujet.

Si la classe est une bibliothèque Java intégrée, les cotes sont égales et hashCode est terminé.

0

Pour les listes triées, voici O (n). Si un tri est nécessaire, cette méthode devient O (nlogn).

public void compareLists(final List<T> allProcesses, final List<T> runningProcesses) { 
    // Assume lists are sorted, if not call Collection.sort() on each list (making this O(nlogn)) 
    final Iterator<T> allIter = allProcesses.iterator(); 
    final Iterator<T> runningIter = runningProcesses.iterator(); 
    T allEntry; 
    T runningEntry; 
    while (allIter.hasNext() && runningIter.hasNext()) { 
     allEntry = allIter.next(); 
     runningEntry = runningIter.next(); 
     while (!allEntry.equals(runningEntry) && allIter.hasNext()) { 
      System.out.println(allEntry); 
      allEntry = allIter.next(); 
     } 
     // Now we know allEntry == runningEntry, so we can go through to the next iteration 
    } 
    // No more running processes, so just print the remaining entries in the all processes list 
    while (allIter.hasNext()) { 
     System.out.println(allIter.next()); 
    } 
} 
4

Si l'on suppose vos listes ne sont pas trop longtemps, il vous suffit de recueillir tous les éléments de AllProcessList qui ne sont pas dans le RunningProceesList

for (Object process : AllProcessList) { 
     if (!RunningProcessList.contains(process)) { 
      list3.add(process); 
     } 
    } 

il est important que le RunningProcessList contient les mêmes instances que le AllProcessList (ou les objets doivent implémenter une méthode fonctionnelle equals).


il serait mieux si votre liste contient des instances de Process (ou d'une autre classe dédiée).

List<Process> AllProcessList = new ArrayList<Process>(); 
    List<Process> RunningProcessList = new ArrayList<Process>(); 
    List<Process> list3 = new ArrayList<Process>(); 
    ... 
    for (Process process : AllProcessList) { 
     if (!RunningProcessList.contains(process)) { 
      list3.add(process); 
     } 
    } 

anglais n'est pas mon premier (ni seconde) langue, toute correction est la bienvenue

+0

+1 pour l'élégance –

1

Salut lakshmi,

J'upvoted noelmarkham's answer que je pense qu'il est le meilleur sage et convient code Votre Besoins. Donc, je ne vais pas ajouter un autre extrait de code à cette liste déjà longue, je voulais juste vous pointer vers deux choses:

  1. Si vos processus sont uniques (leur nom/id autre), vous pouvez envisager de utilisez (Hash) Sets afin de les stocker pour une meilleure performance de vos opérations souhaitées. Cela ne devrait être une préoccupation lorsque vos listes sont volumineuses.
  2. Qu'en est-il de l'utilisation de ActiveProcesses et InactiveProccesses au lieu de Vos deux listes actuelles? Si un processus change son état, il suffit de le retirer d'une liste et de l'insérer dans l'autre. Cela conduirait à une conception globale plus propre et vous pourriez accéder aux processus qui ne fonctionnent pas immédiatement.

Salutations

Questions connexes