1
votes

Comment convertir une liste de chaînes en LinkedHashMap?

J'ai une liste:

liste privée Liste;

Je veux la convertir en LinkedHashMap (pour préserver l'ordre), de sorte que le premier deux valeurs dans la carte sont une entrée LinkedHashMap et ainsi de suite jusqu'à ce que la liste soit une LinkedHashMap:

Private LinkedHashMap linked;

Ceci est ce que je suis venu avec. Certes, je suis nouveau dans les implémentations de Collectors, alors soyez patient:

zero:test0
one:test1
two:test2

cela me donne une erreur sur la ligne du constructeur LinkedHashMap:

Impossible de résoudre le constructeur de LinkedHashMap

Voici un exemple de ce à quoi la liste peut ressembler:

zero
test0
one
test1
two
test2

et ce à quoi je veux que la carte ressembler à:

            linked = list.stream()
                .collect(Collectors.toMap(
                        Function.identity(),
                        String::valueOf, //Used to be String::length
                        LinkedHashMap::new));

Merci


5 commentaires

String :: length renvoie Integer pas String


Vouliez-vous déclarer lié ​​ comme Map ?


Pouvez-vous s'il vous plaît donner des exemples de ce à quoi vous voulez que le LinkedHashMap ressemble pour différentes listes d'entrée?


Je voulais déclarer Map @ernest_k


s'il vous plaît voir OP @dnault


3 Réponses :


0
votes

Vous avez manqué fonction de fusion :

une fonction de fusion, utilisée pour résoudre les collisions entre les valeurs associées à la même clé, comme fournie à Map.merge (Object, Object, BiFunction)

Mais pour remplir la carte avec vos valeurs attendues à l'aide de l'API de flux, vous pouvez utiliser la méthode forEach et IntStream :: iterate de java9

LinkedHashMap<String, String> linked = new LinkedHashMap<>();

IntStream.iterate(0, n -> n < list.size(), n -> n + 2)
        .forEach(i -> linked.put(list.get(i), list.get(i + 1)));


4 commentaires

Salut, merci pour la réponse. Vous avez raison, je manque l'instruction de fusion. Comment faire cela pour ?


Salut merci encore. Quelle est l'erreur, L'opérateur '+' ne peut pas être appliqué à '', 'int il n'autorise pas les expressions lambda en combinaison avec des opérations mathématiques?


Non, c'est tout seul. J'obtiens une erreur pour les deux opérations mathématiques n -> n AND n -> n + 2 // L'opérateur '+' ne peut pas être appliqué à ''


@ dk40149 La méthode iterate est disponible à partir de java9



2
votes

Pourquoi vous compliquez votre code, une simple boucle dans votre cas résout le problème:

zero:test0
one:test1
two:test2

Démonstration rapide, Ideone


0 commentaires

0
votes

C'est ma tentative avec java 8.

   IntStream.range(0, list.size())
            .mapToObj(index -> {
                    if (index % 2 == 0) {
                        return new AbstractMap.SimpleImmutableEntry<>(list.get(index), list.get(index + 1));
                    }
                    return null;
                }
            )
            .filter(Objects::nonNull)
            .collect(Collectors.toMap(AbstractMap.SimpleImmutableEntry::getKey, AbstractMap.SimpleImmutableEntry::getValue));


0 commentaires