Une méthode pour inverser l’effet de java Ssortingng.split ()?

Je cherche une méthode pour combiner un tableau de chaînes en une chaîne délimitée. Un opposé à diviser (). J’ai vu ça dans d’autres langues.

Je voulais demander au forum avant d’essayer d’écrire le mien (puisque le JDK a tout …)

Merci,

Je ne connais aucune méthode dans le JDK. Apache Commons Lang dispose de plusieurs méthodes join() surchargées dans la classe SsortingngUtils qui font ce que vous voulez.

Il y a eu une demande de fonctionnalité ouverte depuis au moins 2009. Le long et le bas, c’est qu’il fera partie des fonctionnalités de la classe java.util.SsortingngJoiner de JDK 8. http://download.java.net/lambda/b81/docs/api/java/util/ssortingngJoiner.html

Voici le problème d’Oracle si vous êtes intéressé. http://bugs.sun.com/view_bug.do?bug_id=5015163

Mettre à jour

Voici un exemple du nouveau JDK 8 SsortingngJoiner sur un tableau de Ssortingng

 Ssortingng[] a = new Ssortingng[]{"first","second","third"}; SsortingngJoiner sj = new SsortingngJoiner(","); for(Ssortingng s:a) sj.add(s); System.out.println(sj); //first,second,third 

Une méthode utilitaire dans Ssortingng rend cela encore plus simple:

 Ssortingng s = Ssortingng.join(",", ssortingngArray); 

Vous pouvez extraire cette fonctionnalité du package utilitaire Arrays .

 import java.util.Arrays; ... Ssortingng delim = ":", csv_record = "Field0:Field1:Field2", fields[] = csv_record.split(delim); Ssortingng rebuilt_record = Arrays.toSsortingng(fields).replace(", ", delim).replaceAll("[\\[\\]]", ""); 

J’ai eu l’exemple suivant ici

 /* 7) Join Ssortingngs using separator >>>AB$#$CD$#$EF */ import org.apache.commons.lang.SsortingngUtils; public class SsortingngUtilsTrial { public static void main(Ssortingng[] args) { // Join all Ssortingngs in the Array into a Single Ssortingng, separated by $#$ System.out.println("7) Join Ssortingngs using separator >>>" + SsortingngUtils.join(new Ssortingng[] { "AB", "CD", "EF" }, "$#$")); } } 

Google fournit également un cours de menuisier dans sa bibliothèque de collections Google:

API de menuisier

Collections Google

Il y a plusieurs exemples sur les extraits de DZone si vous voulez lancer votre propre travail avec une collection. Par exemple:

 public static Ssortingng join(AbstractCollection s, Ssortingng delimiter) { if (s == null || s.isEmpty()) return ""; Iterator iter = s.iterator(); SsortingngBuilder builder = new SsortingngBuilder(iter.next()); while( iter.hasNext() ) { builder.append(delimiter).append(iter.next()); } return builder.toSsortingng(); } 

Si vous avez un int [], Arrays.toSsortingng() est le moyen le plus simple.

Basé sur toutes les réponses précédentes:

 public static Ssortingng join(Iterable< ? extends Object> elements, CharSequence separator) { SsortingngBuilder builder = new SsortingngBuilder(); if (elements != null) { Iterator< ? extends Object> iter = elements.iterator(); if(iter.hasNext()) { builder.append( Ssortingng.valueOf( iter.next() ) ); while(iter.hasNext()) { builder .append( separator ) .append( Ssortingng.valueOf( iter.next() ) ); } } } return builder.toSsortingng(); } 

Pour Android: dans android.text.TextUtils il existe des méthodes:

 public static Ssortingng join (CharSequence delimiter, Iterable tokens) public static Ssortingng join (CharSequence delimiter, Object[] tokens) 

Renvoie une chaîne contenant les jetons joints par des délimiteurs.

tokens – un object tableau à joindre. Les chaînes seront formées à partir des objects en appelant object.toSsortingng ().

Celui-ci n’est pas mal aussi:

 public static Ssortingng join(Ssortingng delimitor,Ssortingng ... subkeys) { Ssortingng result = null; if(null!=subkeys && subkeys.length>0) { SsortingngBuffer joinBuffer = new SsortingngBuffer(subkeys[0]); for(int idx=1;idx 

J’ai écrit celui-ci:

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

Collection n’est pas supscope par JSP, donc pour TLD 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 :

 < ?xml version="1.0" encoding="UTF-8"?>  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, ", ")} 

Par souci d’exhaustivité, j’aimerais append que vous ne pouvez pas inverser Ssortingng # split en général, car il accepte une expression régulière.

"hello__world".split("_+"); Donne ["hello", "world"] .
"hello_world".split("_+"); Donne ["hello", "world"] .

Celles-ci donnent des résultats identiques à partir d’un sharepoint départ différent. le fractionnement n’est pas une opération individuelle et n’est donc pas réversible.

Cela étant dit, si vous supposez que votre paramètre est une chaîne fixe, pas une expression régulière, vous pouvez certainement le faire en utilisant l’une des nombreuses réponses postées.

Le code ci-dessous donne une idée de base. Ce n’est pas la meilleure solution cependant.

 public static Ssortingng splitJoin(Ssortingng sourceStr, Ssortingng delim,boolean sortingm,boolean ignoreEmpty){ return join(Arrays.asList(sourceStr.split(delim)), delim, ignoreEmpty); } public static Ssortingng join(List< ?> list, Ssortingng delim, boolean ignoreEmpty) { int len = list.size(); if (len == 0) return ""; SsortingngBuilder sb = new SsortingngBuilder(list.get(0).toSsortingng()); for (int i = 1; i < len; i++) { if (ignoreEmpty && !StringUtils.isBlank(list.get(i).toString())) { sb.append(delim); sb.append(list.get(i).toString().trim()); } } return sb.toString(); } 

Depuis JDK8, j’aime beaucoup Streams et Lambdas, alors je suggère:

 public static Ssortingng join( Ssortingng delimiter, Ssortingng[] array ) { return Arrays.asList( array ).stream().collect( Collectors.joining( delimiter ) ); } 

J’aime mieux ça:

 public Ssortingng join(Collection strCollection, Ssortingng delimiter) { Ssortingng joined = ""; int noOfItems = 0; for (Ssortingng item : strCollection) { joined += item; if (++noOfItems < strCollection.size()) joined += delimiter; } return joined; } 

C'est la solution la plus nette que j'ai trouvée jusqu'à présent. (Ne vous souciez pas de l'utilisation des objects Ssortingng bruts au lieu de SsortingngBuilder. Les compilateurs Java modernes utilisent de toute façon SsortingngBuilder, mais ce code est plus lisible).

Si vous utilisez jdk8, voyez la réponse de @Nathaniel Johnson car c’est mieux.

Je pense que beaucoup de réponses ici sont complexes ou difficiles à lire. Avec une prédiction de twig si efficace, pourquoi ne pas simplement utiliser une instruction if?

 public static Ssortingng join(List fooList){ if (fooList.isEmpty()) return ""; SsortingngBuilder sb = null; for (Ssortingng element : fooList) { if (sb == null) { sb = new SsortingngBuilder(); } else { sb.append(", "); } sb.append(element); } return sb.toSsortingng(); } 

Il convient de mentionner qu’Apache utilise une simple boucle for avec une instruction if comme celle-ci (il utilise un tableau comme index pour connaître le premier élément), et openjdk 8 fait la même chose, mais dans des méthodes séparées, au lieu d’appeler boucle simple.