2010-09-03 9 views
3

Je dois joindre deux listes en Java. J'ai une liste qui a une VO qui a un nom et une description. J'ai une autre liste qui a le même type de VO qui a le nom et l'adresse. Le "nom" est le même. J'ai besoin de créer une liste avec cette VO qui a à la fois nom, adresse et description. La structure VO estJoindre deux listes en Java

public class PersonDetails{ 
    private String name; 
    private String description; 
    private String address; 
//getters and setters 
} 

Quelqu'un peut-il s'il vous plaît me suggérer la meilleure façon mettre en œuvre?

+0

Vos deux listes sont-elles de la même taille? Chaque élément dans le premier est dans le second et vice-versa? Chaque élément est-il unique dans votre liste? –

+0

Que signifie VO? –

+2

@vash VO = objet de valeur – atamanroman

Répondre

2

Mettez tous les éléments de la première liste dans une carte , puis fusionner le contenu de la deuxième liste en elle:

final List<PersonDetails> listWithAddress = 
    new ArrayList<PersonDetails>(); 
final List<PersonDetails> listWithDescription = 
    new ArrayList<PersonDetails>(); 
// fill both lists with data 

final Map<String, PersonDetails> map = 
    // map sorted by name, change to HashMap otherwise 
    // (or to LinkHashMap if you need to preserve the order) 
    new TreeMap<String, PersonDetails>(); 

for(final PersonDetails detailsWithAddress : listWithAddress){ 
    map.put(detailsWithAddress.getName(), detailsWithAddress); 
} 
for(final PersonDetails detailsWithDescription : listWithDescription){ 
    final PersonDetails retrieved = 
     map.get(detailsWithDescription.getName()); 
    if(retrieved == null){ 
     map.put(detailsWithDescription.getName(), 
      detailsWithDescription); 
    } else{ 
     retrieved.setDescription(detailsWithDescription.getDescription()); 
    } 
} 
5

Cela dépend:

Si les listes contiennent les deux exactement les mêmes données, vous pouvez les trier à la fois par son nom, itérer sur eux en définir la propriété manquante.

Sinon, je mettrais la première liste dans une carte, avec le nom comme clé. Passez ensuite en revue la deuxième liste, recherchez la VO sur la carte et définissez la valeur. Ensuite, sortez toute la valeur de la carte à nouveau sous la forme d'une liste. Si les listes contiennent à la fois EXACT et le même VO (égal par nom), vous pouvez l'utiliser.

public List<Vo> merge(List<Vo> list1, List<Vo> list2) { 

    Collections.sort(list1, new Comparator<Vo>() { 

     public int compare(Vo o1, Vo o2) { 
      return o1.name.compareTo(o2.name); 
     } 
    }); 

    Collections.sort(list2, new Comparator<Vo>() { 

     public int compare(Vo o1, Vo o2) { 
      return o1.name.compareTo(o2.name); 
     } 
    }); 

    for(int i = 0; i < list1.size(); i++){ 
     list1.get(i).description = list2.get(i).description; 
    } 

    return list1; 

} 
+0

me semble être un gagnant –

1

Passez de la liste à HashMap, utilisez la chaîne de nom comme clé. Vous pouvez donc fusionner vos données de manière efficace.

1
List<VO> list = new ArrayList<VO>(); 
for (VO vo1 : vo1List) { 
    for (VO vo2 : vo2List) { 
    if (vo1.getName().equals(vo2.getName())) { 
     VO newVo = new VO(); 
     newVO.setName(vo1.getName()); 
     newVO.setDescription(vo1.getDescription()); 
     newVO.setAddress(vo2.getAddress); 
     list.add(newVO); 
     break; 
    } 
} 

}

Il est préférable de trier les listes sur le nom à l'avance, il fait la double itération plus rapide.

+0

bonne idée, mais pourquoi ne pas écrire des données de vo2 à vo1, cela sauverait beaucoup de créations d'objet? –

+0

@seanizer exactement, mais l'exemple a été conçu comme un exemple simple pour donner à l'OP l'idée de la façon de le faire en utilisant une double boucle. – nkr1pt

2

Je voudrais mettre chaque liste des listes VO source dans une carte par nom, créer un ensemble des deux clés, l'itérer et ajouter une VO cible à la liste des résultats.

Dans le code exemple, VO est la cible VO, VOD est la source VO avec la description que, VOA est la source VO avec adresse seulement:

List<VOD> descriptions = ...; 
List<VOA> addresses = ...; 
Map<String,String> description ByName = new HashMap<String,String>(); 
for (VOD description : descriptions) { 
    descriptionByName.put(description.name, description.description); 
} 
Map<String,String> addressByName = new HashMap<String,String>(); 
for (VOA address: addresses) { 
    addressByName.put(address.name, address.address); 
} 

Set<String> allNames = new HashSet<String>(); 
allNames.addAll(descriptionByName.keySet()); 
allNames.addAll(addressByName.keySet()); 

List<VO> result = new ArrayList<VO>(); 
for (String name : allNames) { 
    VO one = new VO(); 
    one.name = name; 
    one.address = addressByName.get(name) 
    one.description = descriptionByName.get(name) 
    result.add(one); 
}