2010-10-20 8 views
2

J'ai regardé autour de moi, mais je n'arrive pas à trouver un appel d'API qui fait ce qui suit: Je dois fusionner toutes les ArrayLists dans un ArrayList pour former un ArrayList avec tous les éléments de tous les sous-ArrayLists, si cela a du sens.Java ArrayList: fusionner ArrayLists dans ArrayLists pour créer une ArrayList

Voici un exemple:

{ "Il est", "a", { "petit", "monde "après"}, {" all "}} devient {" Il est », "a", « petit », « monde », « après », « all »}

+1

Sons comme devoirs pour récursion –

Répondre

3
public List<?> flatten(List<?> input) { 
    List<Object> result = new ArrayList<Object>(); 

    for (Object o: input) { 
     if (o instanceof List<?>) { 
      result.addAll(flatten((List<?>) o)); 
     } else { 
      result.add(o); 
     } 
    } 

    return result; 
} 
+0

Pouvez-vous donner un exemple de comment appeler correctement ceci? méthode? Je n'ai pas utilisé le? avec java génériques avant et je suis assez sûr (malgré googling) je n'ai toujours pas compris. –

+1

@Nick: Vous pouvez passer n'importe quelle liste, mais vous obtenez la liste des "inconnues". Cette méthode ne peut pas promettre plus que cela. Si vous êtes sûr que les éléments de la liste d'entrée sont T ou Liste , vous pouvez ensuite renvoyer la liste résultante à (Liste ) (vous recevrez un avertissement du compilateur à ce sujet). Sinon, la liste est similaire à la liste d'objets, sauf que vous ne pouvez en récupérer que des éléments. Si vous changez le type de retour de la méthode à la liste cela fonctionnera toujours correctement, et il vous permettra de modifier la liste résultante sans plus de conversion. –

+0

Maintenant, tout est logique, merci Peter! –

2

pour construire au-dessus de Thilo's answer et d'éviter une nouvelle mise en œuvre de votre propre, pensez Groovy de Collection.flatten()

+2

Y en a-t-il aussi dans les collections Guava ou Commons (pour les personnes qui ne sont pas assez groovy)? – Thilo

+2

@Thilo: devinez quoi, j'ai effectivement regardé aussi, vous avez lu dans mes pensées! Étonnamment, je n'en ai pas trouvé, bien que je m'attendrais à ce que Guava l'ait quelque part. Apache Commons Collections a un FlatMap ou quelque chose, mais pas de "flattenizer" que je connaisse. – haylem