J'ai configuré ce flux ci-dessous et je ne peux pas utiliser la méthode count () sur .map. Uniquement sur filtre. Mais je n'ai pas configuré de condition de filtre. Comment pourrais-je le faire sur un tableau de chaînes pour ce flux ci-dessous?
Je veux trier les chaînes en fonction de l'expression régulière dans replaceAll et obtenir les chaînes uniques et obtenir le nombre total de chaînes uniques.
Stream newStream = Arrays.stream(arr) .map(s -> s.replaceAll("[^a-z]", "")) .distinct()
3 Réponses :
Si vous deviez compter le nombre de chaînes distinctes
, vous pouvez le faire comme:
long countDistinct = Arrays.stream(arr) .map(s -> s.replaceAll("[^a-z]", "")) .distinct() // intermediate operation with unique strings as 'Stream' return type .count(); // terminal operation with count of such strings as return type
Merci, mais j'obtiens une erreur dans Eclipse disant: Incompatibilité de type: impossible de convertir de long en Stream
Je dois utiliser le Stream dans la déclaration.
@Doerad eh bien, vous devriez noter le type de retour de l'expression que j'ai mis à jour, car vous deviez tenir compte du «nombre» de caractères.
Comment pourrais-je avec le 'Stream' comme type de retour, obtenir le nombre distinct d'éléments String? Dois-je l'utiliser dans un newStream.forEach ()
et le calculer ici?
@Doerad de quoi ça va être un flux? n'est-ce pas juste un compte?
@Owen Non, c'est un tableau que je vais compter. String [] arr = text.split ("");
@Doerad je veux dire le résultat. Le résultat n'est-il pas juste un nombre?
@Owen C'est ma question de savoir comment obtenir un numéro d'une manière ou d'une autre. En ce moment, j'obtiens tous les résultats des chaînes qui correspondent à chaque ligne avec ceci: newStream.forEach (x -> System.out.println (x));
La liste contiendra également une chaîne vide distincte ""
(augmentant ainsi son nombre)
@KrishPrabakar pourrais-tu expliquer ce que tu voulais dire? incapable de raconter
@Naman Après distinct ()
si vous imprimez la liste, elle s'imprime comme [ one, two]
, veuillez noter la chaîne vide comme premier élément de la liste (d'où count est 3
et non 2
).
@KrishPrabakar et quelle a été votre contribution? si le tableau est constitué d'un ""
, alors oui il y aurait 3 éléments distincts, notez qu'il n'y a pas de filtre
impliqué dans la question ou la réponse.
@Naman - J'ai fait ceci: String text = "FOO bar BAZ TEXT text some"; String [] arr = text.split ("");
, cette logique est basée sur les commentaires d'OP ci-dessus. Sans ce filtre, la liste est: [ bar, some, text]
. J'ai en fait posté mon code essayé comme réponse ci-dessous.
@KrishPrabakar Je comprends ce que vous pointez, juste que la question ne semble pas pointer vers cet aspect.
Je ne suis pas sûr de bien comprendre votre exigence. Il semble que vous vouliez une Liste
avec les chaînes distinctes triées après l'application de l'expression régulière à chaque élément du tableau. Cette Liste
aurait à la fois les éléments et leur nombre:
Stream<String> newStream = list.stream();
Maintenant, la liste
contient les éléments. Et si vous voulez également savoir combien d'éléments il contient, utilisez simplement la méthode List.size
:
int count = list.size();
EDIT : Si vous avez également besoin d'un Stream
avec les chaînes modifiées, uniques et triées, créez simplement un nouveau Stream
à partir de la liste
:
List<String> list = Arrays.stream(arr) .map(s -> s.replaceAll("[^a-z]", "")) .distinct() .sorted() .collect(Collectors.toList());
L'opération .filter (s ->! s.isEmpty ())
est également nécessaire pour éviter la chaîne vide - ""
ajoutée au décompte
@KrishPrabakar Il n'est pas clair d'après la question si l'utilisateur veut ou non la chaîne vide
Vous avez raison, mais (juste ma pensée que) lorsque OP veut le nombre de chaînes uniques à partir d'une entrée de texte (par exemple à partir d'un fichier), il est fort probable qu'il ait voulu éviter de tels cas extrêmes.
La collecte sous forme de liste et l'obtention du nombre total sont des opérations de terminal, vous ne pouvez donc effectuer que l'un ou l'autre sur un flux en direct.
Si vous devez utiliser le même pour obtenir à la fois la liste des chaînes et le nombre, une option (hacky) serait d'utiliser Supplier
:
Unique strings are: [bar, some, text] Count of Unique strings are: 3
Ci-dessus donne cette sortie:
String text = "FOO bar BAZ TEXT text some"; String[] arr = text.split(" "); Supplier<Stream<String>> sameStream = () -> Arrays.stream(arr) .map(s -> s.replaceAll("[^a-z]", "")) .distinct() .filter(s -> !s.isEmpty()) .sorted(); System.out.println("Unique strings are: " + sameStream.get().collect(Collectors.toList())); System.out.println("Count of Unique strings are: " + sameStream.get().count());
quel est ton but?
@YCF_L a mis à jour la question.