0
votes

Comment obtenir une liste d'éléments d'un sous-ensemble d'une liste, en fonction des éléments d'une autre liste de Java?

J'ai une liste qui représente l'ID (peut être dupliquer), des éléments d'une autre liste, qui est une liste , Lorsque chaque triche a un identifiant de chaîne et une liste rng . Les deux ont des méthodes accessoires en triche.

Je dois convertir cette liste d'identifiants, dans une liste de RNG pour chaque triche que j'ai été fournie avec l'ID pour.

Par exemple, je pourrais avoir 3 astuces: xxx

et une liste d'identifiants de: xxx

Je devrais finir avec une liste finale de {1,1,2,3,1,2,1,1,2}, qui est la RNG de la triche 3, puis la RNG de triche 1, puis la RNG de triche 1 à nouveau, puis finalement la RNG de la triche 2

Si quelqu'un pouvait m'aider, il serait apprécié. Merci.

J'ai essayé et j'ai échoué avec: xxx


1 commentaires

Pourriez-vous ajouter ce que vous avez essayé jusqu'à présent?


3 Réponses :


1
votes

La Lambda que vous passez à Flatmap doit renvoyer un flux , pas une liste . Et vous devez gérer le cas où il n'y a pas d'élément de ce type dans le courant - même si vous êtes sûr qu'il y en a. Quelque chose comme ça devrait faire: XXX

En outre, je proposerais de convertir la liste des tricheurs vers une carte - qui simplifierait le code et réduirait la complexité de la recherche de O (n) à O (n) à (1).


0 commentaires

2
votes

Une solution possible:

import java.util.List;
import java.util.stream.Collectors;

class Scratch {

    static class Cheat {
        int id;
        List<Integer> rng;

        public Cheat(int id, List<Integer> rng) {
            this.id = id;
            this.rng = rng;
        }
    }

    public static void main(String[] args) {

        List<Cheat> allCheats = List.of(
                new Cheat(1, List.of(1,2,3)),
                new Cheat(2, List.of(1,2)),
                new Cheat(3, List.of(1))
        );

        List<Integer> result = List.of(3, 1, 1, 2).stream()
                .flatMap(id -> allCheats.stream()
                        .filter(cheat -> cheat.id == id)
                        .findFirst().orElseThrow().rng.stream())
                .collect(Collectors.toList());

        System.out.println(result);

    }
}


1 commentaires

Remarque: ceci crée un flux à chaque fois pour le même ID itération Allcheats qui peut être réduit par L'autre réponse . par exemple. Pour 1,1 dans l'entrée, il irait itérer le Allcheats deux fois.



0
votes

Vous pouvez atteindre cela avec les étapes suivantes:

  1. Créez une carte de Cheatide à rnd ID s associé: XXX

  2. Itéréter sur le Churetides fourni en entrée et obtenez les identifiants RNG correspondants de la carte à collecter en tant que sortie: XXX


0 commentaires