Equivalents Java de C # Ssortingng.Format () et Ssortingng.Join ()

Je sais que c’est une question de débutant, mais y a-t-il des équivalents aux opérations sur les chaînes de C # en Java?

Plus précisément, je parle de Ssortingng.Format et Ssortingng.Join .

L’object Java Ssortingng a une méthode de format (à partir de 1.5), mais aucune méthode de join .

Pour obtenir un tas de méthodes utilitaires Ssortingng non incluses, vous pouvez utiliser org.apache.commons.lang.SsortingngUtils .

Ssortingng.format . En ce qui concerne rejoindre, vous devez écrire le vôtre:

  static Ssortingng join(Collection s, Ssortingng delimiter) { SsortingngBuilder builder = new SsortingngBuilder(); Iterator iter = s.iterator(); while (iter.hasNext()) { builder.append(iter.next()); if (!iter.hasNext()) { break; } builder.append(delimiter); } return builder.toSsortingng(); } 

Ce qui précède vient de http://snippets.dzone.com/posts/show/91

La goyave est livrée avec la classe Joiner .

 import com.google.common.base.Joiner; Joiner.on(separator).join(data); 

Depuis Java 8, join() est désormais disponible en deux méthodes de classe sur la classe Ssortingng. Dans les deux cas, le premier argument est le délimiteur.

Vous pouvez passer des caractères CharSequence individuels comme arguments supplémentaires :

 Ssortingng joined = Ssortingng.join(", ", "Antimony", "Arsenic", "Aluminum", "Selenium"); // "Antimony, Arsenic, Alumninum, Selenium" 

Ou vous pouvez passer un Iterable Iterable :

 List ssortingngs = new LinkedList(); ssortingngs.add("EX"); ssortingngs.add("TER"); ssortingngs.add("MIN"); ssortingngs.add("ATE"); Ssortingng joined = Ssortingng.join("-", ssortingngs); // "EX-TER-MIN-ATE" 

Java 8 ajoute également une nouvelle classe, SsortingngJoiner , que vous pouvez utiliser comme ceci:

 SsortingngJoiner joiner = new SsortingngJoiner("&"); joiner.add("x=9"); joiner.add("y=5667.7"); joiner.add("z=-33.0"); Ssortingng joined = joiner.toSsortingng(); // "x=9&y=5667.7&z=-33.0" 

TextUtils.join est disponible sur Android

Vous pouvez également utiliser des arguments variables pour les chaînes comme suit:

  Ssortingng join (Ssortingng delim, Ssortingng ... data) { SsortingngBuilder sb = new SsortingngBuilder(); for (int i = 0; i < data.length; i++) { sb.append(data[i]); if (i >= data.length-1) {break;} sb.append(delim); } return sb.toSsortingng(); } 

En ce qui concerne l’adhésion, je pense que cela pourrait paraître un peu moins compliqué:

 public Ssortingng join (Collection c) { SsortingngBuilder sb=new SsortingngBuilder(); for(Ssortingng s: c) sb.append(s); return sb.toSsortingng(); } 

Je ne parviens pas à utiliser la syntaxe Java 5 autant que je le voudrais (croyez-le ou non, j’ai utilisé 1.0.x récemment), donc je suis peut-être un peu rouillé, mais je suis sûr que le concept est correct .

edit addition: les ajouts de chaînes peuvent être ralentis, mais si vous travaillez sur du code GUI ou une routine de courte durée, ce n’est pas grave si vous prenez 005 secondes ou .006, donc si vous aviez une collection appelée “joinMe” que vous souhaitez append à une chaîne existante “target”, il ne serait pas horrible de simplement inclure ceci:

 for(Ssortingng s : joinMe) target += s; 

C’est assez inefficace (et une mauvaise habitude), mais rien de ce que vous pourrez percevoir à moins qu’il y ait des milliers de chaînes ou que cela soit dans une boucle énorme ou que votre code soit vraiment critique.

Plus important encore, il est facile à retenir, bref, rapide et très lisible. La performance n’est pas toujours le gagnant automatique dans les choix de conception.

Voici une réponse assez simple. Utilisez += car c’est moins de code et laissez l’optimiseur le convertir en un SsortingngBuilder pour vous. En utilisant cette méthode, vous n’avez pas à faire de “dernière vérification” dans votre boucle (amélioration des performances) et vous n’avez pas à vous soucier de supprimer les délimiteurs à la fin.

  Iterator iter = args.iterator(); output += iter.hasNext() ? iter.next() : ""; while (iter.hasNext()) { output += "," + iter.next(); } 

Je ne voulais pas importer une bibliothèque Apache complète pour append une fonction de jointure simple, alors voici mon hack.

  public Ssortingng join(Ssortingng delim, List destinations) { SsortingngBuilder sb = new SsortingngBuilder(); int delimLength = delim.length(); for (Ssortingng s: destinations) { sb.append(s); sb.append(delim); } // we have appended the delimiter to the end // in the previous for-loop. Let's now remove it. if (sb.length() >= delimLength) { return sb.subssortingng(0, sb.length() - delimLength); } else { return sb.toSsortingng(); } } 

Si vous souhaitez joindre (concaténer) plusieurs chaînes en une seule, vous devez utiliser un SsortingngBuilder. C’est bien mieux que d’utiliser

 for(Ssortingng s : joinMe) target += s; 

Il y a aussi un léger gain de performance sur SsortingngBuffer, puisque SsortingngBuilder n’utilise pas la synchronisation.

Pour une méthode d’utilitaire à usage général comme celle-ci, elle sera (éventuellement) appelée plusieurs fois dans de nombreuses situations, vous devez donc la rendre efficace et ne pas allouer beaucoup d’objects transitoires. Nous avons profilé de nombreuses applications Java, et nous trouvons presque toujours que la concaténation de chaînes et l’allocation de chaînes / caractères prennent beaucoup de temps et de mémoire.

Notre méthode de collecte réutilisable -> chaîne de caractères calcule d’abord la taille du résultat requirejs, puis crée un SsortingngBuilder avec cette taille initiale; Cela évite le doublage / copie inutile du caractère interne [] utilisé lors de l’ajout de chaînes.

J’ai écrit moi-même:

 public static Ssortingng join(Collection col, Ssortingng delim) { SsortingngBuilder sb = new SsortingngBuilder(); Iterator iter = col.iterator(); if (iter.hasNext()) sb.append(iter.next().toSsortingng()); while (iter.hasNext()) { sb.append(delim); sb.append(iter.next().toSsortingng()); } return sb.toSsortingng(); } 

mais Collection n’est pas supporté par JSP, donc pour la fonction tag j’ai écrit:

 public static Ssortingng join(List list, Ssortingng delim) { int len = list.size(); if (len == 0) return ""; SsortingngBuilder sb = new SsortingngBuilder(list.get(0).toSsortingng()); for (int i = 1; i < len; i++) { sb.append(delim); sb.append(list.get(i).toString()); } return sb.toString(); } 

et mettre au fichier .tld :

   join com.core.util.ReportUtil java.lang.Ssortingng join(java.util.List, java.lang.Ssortingng)   

et l'utiliser dans les fichiers JSP en tant que:

 <%@taglib prefix="funnyFmt" uri="tag:com.core.util,2013:funnyFmt"%> ${funnyFmt:join(books, ", ")} 

SsortingngUtils est une classe très utile dans la bibliothèque Apache Commons Lang.

Il y a MessageFormat.format() qui fonctionne comme MessageFormat.format() C #.

Je vois beaucoup d’implémentations trop complexes de Ssortingng.Join ici. Si vous n’avez pas Java 1.8 et que vous ne voulez pas importer une nouvelle bibliothèque, l’implémentation ci-dessous devrait suffire.

 public Ssortingng join(Collection col, Ssortingng delim) { SsortingngBuilder sb = new SsortingngBuilder(); for ( Ssortingng s : col ) { if ( sb.length() != 0 ) sb.append(delim); sb.append(s); } return sb.toSsortingng(); } 
 ArrayList j=new ArrayList<>; j.add(1); j.add(.92); j.add(3); String ntop=j.toString(); //ntop= "[1, 0.92, 3]" 

Donc, fondamentalement, le Ssortingng ntop stocke la valeur de la collection entière avec des séparateurs de virgules et des crochets.

Je voudrais juste utiliser l’opérateur de concaténation de chaîne “+” pour joindre deux chaînes. s1 += s2;