2009-12-17 5 views
0

Dites que je veux copier tous les éléments de la liste A dans la liste B. Mais les éléments de la liste A sont de type ExampleClass et les éléments de la liste B sont String.Comment copier facilement un type de liste dans un autre type?

ExampleClass { 
    String a; 
} 

Depuis ExampleClass a un attribut a qui est une chaîne, lors de la conversion de ExampleClass à chaîne Je veux la valeur d'un être retourné comme la chaîne qui représente ExampleClass. Est-ce que toString() le ferait? Quel est le moyen le plus efficace de le faire sans avoir à parcourir toute la liste A, convertir chaque ExampleClass en String, et les ajouter à la liste B?

+0

Pourquoi voulez-vous faire cela? Pourquoi ne pas simplement boucler sur la liste A et lire l'attribut 'a' de chaque élément? Quel est le point de créer une autre liste? –

+0

@Pascal: Peut-être qu'il doit avoir une liste pour passer à un autre appel de méthode? – Thilo

Répondre

2

Vous devez parcourir la liste, convertir chaque élément et l'ajouter à l'autre liste. Il n'y a pas d'autre moyen. Même si vous utilisez une bibliothèque pour ce faire, il devrait toujours faire exactement cela.

Comme pour toString() étant significatif dans cette situation, cela dépend totalement de votre classe. Au minimum, ExampleClass doit implémenter toString(), car l'implémentation par défaut ressemble à "ExampleClass @ abc564", ce qui n'est probablement pas du tout utile pour vous. Il semble que vous souhaitiez utiliser la valeur de son champ a.

Donc, pour résumer

for (ExampleClass e: listA){ 
    listB.add(e.toString()); 
} 

// and in ExampleClass 
public String toString(){ 
    return a; 
} 

Note: si vous substituez toString(), il sera utilisé partout la classe est imprimée, ce qui peut ou ne peut pas être un problème. Pour les besoins de la boucle de conversion, vous pouvez tout aussi bien avoir une méthode getA() et utiliser celle-ci au lieu de toString().

1

Votre question concerne l'efficacité ... alors je vais répondre à cette question.

Afin de copier une liste dans une autre liste, fondamentalement, il n'y a aucun moyen de faire cela que de parcourir tous les éléments à un certain niveau.

Maintenant, vous pouvez réduire la quantité de mémoire allouée et se déplacer si vous souhaitez uniquement copier la chaîne comme référence. Mais quelqu'un à un niveau va faire une boucle à travers N éléments, donc il peut tout aussi bien être vous.

1

J'ai utilisé la classe TransformedList d'Apache Commons dans le passé. Il ne fait pas une copie de la liste, mais décore plutôt une liste avec une fonction de transformation. Dans votre cas, votre Transformer retournera simplement la valeur de a à partir d'un objet.

Essayez cette fonction si vous n'avez pas besoin d'une copie de la liste.

+0

J'ai vraiment besoin d'une copie. Je vais jeter un coup d'oeil de toute façon merci. :) – fent

1

Notez que pour répondre à l'une de vos dernières questions, toString() ne s'imprimera pas à propos des champs de votre classe, sauf si vous remplacez cette méthode et lui dites de le faire. Si vous ne le remplacez pas, la sortie est définie par la méthode toString() de Object (dont la sortie exacte n'est pas spécifiée par l'API autre que "une représentation textuelle", mais dans Sun JREs le nom de classe complet est associé à le hashcode d'identité de l'objet, lui-même dérivé de l'adresse mémoire utilisée par cet objet).

En général, je n'aime pas me fier à une valeur spécifique de toString() pour une classe personnalisée, car elle n'est pas vraiment bien définie, mais je pense qu'elle devrait être lisible par l'utilisateur. Je préfère de loin une méthode explicite getA() à utiliser dans ce cas.

Questions connexes