-3
votes

Comment convertir / trier une chaîne en fonction de deux symboles en Java?

J'ai la chaîne suivante: xxx

et j'essaie de le convertir en: xxx

pour être trié. C'est ce que j'ai essayé jusqu'à présent: xxx

J'ai donc réussi à obtenir le premier élément de chaque "unité" séparément. Mais comment obtenir tous et les commander pour que je reçois ce résultat?

peut-il être encore plus simple à l'aide de Java8?

Merci d'avance!


2 commentaires

Quel est le but de ces j et k variables dans votre deuxième boucle?


@Holger, restes de colle copier innocent :)


4 Réponses :


3
votes

Je suppose une façon de le faire serait: xxx

remarquez simplement que si vos motifs sont plus compliqués que \ n ou ou , < / Code> - Il est judicieux d'extraire ceux d'un modèle distinct (s)


3 commentaires

Ceci est la bonne réponse en raison de Collectors.Joining ("\\ n") . Je ne comprends pas la voix bas :( a mon +1.


@Nikolas de note latérale: vous n'avez pas besoin de vous soucier des bowvotes sans commentaire, je me suis arrêté pour m'occuper de ceux qu'il y a longtemps il y a longtemps


Merci Eugen, aussi voté maintenant. Je ne sais pas pourquoi j'ai eu tellement de bowvotes par je sais que votre réponse est ce que je cherchais.



0
votes
    String string = "bbb,aaa,ccc\n222,111,333\nyyy,xxx,zzz";
    String converted = Arrays.stream(string.split("\\n"))
            .map(s -> Arrays.stream(s.split(","))
                    .sorted()
                    .collect(Collectors.joining(",")))
            .collect(Collectors.joining("\\n"));

1 commentaires

Neutralisé. Mais une suggestion générale, il est plus logique d'expliquer quoi et pourquoi un bloc de code avez-vous partagé comme une réponse.



0
votes

Vous pouvez l'avoir la voie à l'ancienne sans l'utilisation de Java 8 comme ceci: xxx

mais toujours, Java 8 devrait être préféré à mon avis, alors collez-vous à l'une des autres réponses.


1 commentaires

@Holger j'ai ajusté la réponse à être pure



0
votes

Le modèle code> Classe code> vous donne une possibilité de diffuser directement scarpée string code> s.

String string = "bbb,aaa,ccc\n222,111,333\nyyy,xxx,zzz";
Pattern commaPattern = Pattern.compile(",");
String sorted = Pattern.compile("\n").splitAsStream(string)
    .map(elem -> commaPattern.splitAsStream(elem).sorted().collect(Collectors.joining(",")))
    .collect(Collectors.joining("\n"));


3 commentaires

Mais lorsque vous exécutez motif.comple à l'intérieur d'une fonction appliquée à chaque élément, vous détruisez l'avantage de la préparation d'un modèle et aurait pu utiliser la méthode équivalente sur String qui peut appeler motif.comple sous la hotte. Dans cet exemple spécifique, string.split sera encore plus efficace car il gère des motifs uniques de caractères sans signification spéciale à part entière sans toute la machinerie Regex (et les chaînes d'entrée sont plutôt courtes).


@Holger Vous avez raison en termes de préparation du modèle . On pourrait créer une constante. Mais - sans connaître la mise en œuvre réelle - je supposerais que la division puis diffuserait moins de mémoire efficace.


Laisser l'optimisation sans-papiers de String de côté, il est préférable de supposer qu'il y aura un certain nombre d'éléments auquel la matrice créée avant le streaming nécessite plus de mémoire que l'alternative. Donc, pour le code de production avec une entrée inconnue ou lorsque vous chaîne des opérations de court-circuit, motif.splitasstream est en effet le meilleur choix.