web-dev-qa-db-fra.com

Comparez chaque élément à chaque autre élément de ArrayList

J'ai des problèmes avec ce que je pensais être un problème assez simple.

Je dois comparer chaque élément d'une liste de tableaux avec tous les autres éléments de la liste sans comparer les éléments à eux-mêmes. Ce n'est pas aussi simple que d'appeler une comparaison equals (), cela implique une logique personnalisée que j'ai omise de mon code ci-dessous. De plus, la liste de tableaux ne doit en aucun cas être modifiée. 

Le problème que je semble avoir, c'est qu'une fois que je suis entré dans la deuxième boucle, je ne sais pas si j'ai un autre objet à comparer (car c'est une liste de taille variable).

for(int i =0; i< list.size(); i++){ 
    //get first object to compare to
    String a = list.get(i).getA();

    Iterator itr = list.listIterator(i + 1 ); // I don't know if i + 1 is valid
    while(itr.hasNext()){
        // compare A to all remaining items on list
    }
}

Je pense que je vais probablement dans le mauvais sens, je suis ouvert à des suggestions ou des conseils sur la façon de mieux faire cela. 

16
JavaKungFu
for (int i = 0; i < list.size(); i++) {
  for (int j = i+1; j < list.size(); j++) {
    // compare list.get(i) and list.get(j)
  }
}
34
Kaleb Brasee

Quel est le problème avec l'utilisation de la boucle for à l'intérieur, comme à l'extérieur?

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

En général, depuis Java 5, je n’utilisais les itérateurs qu’une ou deux fois.

2
Nikita Rybak

Dans certains cas, c'est la meilleure solution car votre code peut avoir changé quelque chose et j = i + 1 ne vérifie pas cela.

for (int i = 0; i < list.size(); i++{   
    for (int j = 0; j < list.size(); j++) {
                if(i == j) {
                    continue;
                }

}
1
Piotr Jankowski

Le code suivant compare chaque élément à une autre liste d’éléments à l’aide de la méthode contains (). La longueur de la boucle for doit être supérieure à size (), mais elle compare uniquement les valeurs des deux.

List<String> str = new ArrayList<String>();
str.add("first");
str.add("second");
str.add("third");
List<String> str1 = new ArrayList<String>();
str1.add("first");
str1.add("second");
str1.add("third1");
for (int i = 0; i<str1.size(); i++)
{
System.out.println(str.contains(str1.get(i)));
}

La sortie est true True False

0
Karthick

Ce code m'a aidé à obtenir ce comportement: avec une liste a, b, c, je devrais être comparé ab, ac et bc, mais toute autre paire serait excédentaire/inutile.

import Java.util.*;
import static Java.lang.System.out;

// rl = rawList; lr = listReversed
ArrayList<String> rl = new ArrayList<String>();
ArrayList<String> lr = new ArrayList<String>();
rl.add("a");
rl.add("b");
rl.add("c");
rl.add("d");
rl.add("e");
rl.add("f");

lr.addAll(rl);
Collections.reverse(lr);

for (String itemA : rl) {
    lr.remove(lr.size()-1);
        for (String itemZ : lr) {
        System.out.println(itemA + itemZ);
    }
}

La boucle se passe comme dans l’image suivante: Exemple visuel de comparaison triangulaire

ou comme ceci:

   |   f    e    d    c    b   a
   ------------------------------
a  |  af   ae   ad   ac   ab   ·
b  |  bf   be   bd   bc   ·   
c  |  cf   ce   cd   ·      
d  |  df   de   ·         
e  |  ef   ·            
f  |  ·               

le total des comparaisons est un nombre triangulaire (n * n-1)/2

0
BrnLng