Java 8 dispose de cette fonctionnalité prête à l'emploi. Je recommande au lecteur de faire défiler jusqu'à la réponse de @Marek Gregor (et de voter dessus ..)
Pour le bénéfice des personnes recherchant cette réponse, il convient probablement de noter qu'il s'agit également de l'équivalent d'une jointure Perl.
k-den
3
ça dit que c'est indéfini pour moi
Ninjaxor
@Ninjaxor 1. le pot commons-lang * doit être dans classpath 2. import org.apache.commons.lang3.StringUtils;
peterh
9
Je vous recommande de modifier cette réponse pour ajouter une référence à la nouvelle String.join()méthode introduite dans Java 8. De cette façon, le grand nombre de personnes lisant cette réponse acceptée bénéficiera de cette connaissance. Actuellement, la réponse la plus votée mentionnant ce fait est plutôt perdue ci-dessous ...
Duncan Jones
1
Il convient de mentionner que cela String.join()ne fonctionnerait que pour les éléments List<CharSequence>ou CharSequence[].
Enigo
71
Si vous cherchiez quoi utiliser dans Android, c'est:
C'est clairement la meilleure réponse pour toutes les versions d'Android, car Java 8 ne sort que sur Android dans un instant. Cette solution utilise les bibliothèques Android intégrées, plutôt que ces solutions stupides «inclure une énorme bibliothèque pour effectuer une seule action».
LukeStoneHm
Nous sommes en septembre 2017, Java 8 pour Android est encore loin. Merci pour cette réponse!
Aenadon,
57
Dans Java 8, vous pouvez utiliser
1) API de diffusion:
String[] a =newString[]{"a","b","c"};String result =Arrays.stream(a).collect(Collectors.joining(", "));
Vous pouvez facilement écrire une telle fonction dans une dizaine de lignes de code:
String combine(String[] s,String glue){int k = s.length;if( k ==0){returnnull;}StringBuilderout=newStringBuilder();out.append( s[0]);for(int x=1; x < k;++x ){out.append(glue).append(s[x]);}returnout.toString();}
Bonne pratique selon vous ... il n'y a pas de norme universelle pour de telles choses.
phoebus
24
Mais si j'avais inclus des accolades, cela aurait ajouté deux lignes de code supplémentaires, et je n'aurais pas pu prétendre l'avoir fait en 11 lignes!
Jay
8
le problème est quand vous après un certain temps, ou quelqu'un d'autre, pressé, ajoutez une autre ligne à cela si / pour sans ajouter d'accolades; ou supprimer return null après if (k == 0), qui dans certains cas se compile mais sera incorrect. Ensuite, il est préférable de sacrifier une ligne supplémentaire pour cette accolade de fermeture (l'ouverture peut rester dans la même ligne if / for).
mil
16
Je pense que c'est génial que si la plupart des langages intègrent de telles fonctionnalités dans leur cœur, la communauté Java encourage tout le monde à réinventer la roue.
John Strickler
33
11 lignes? Bah! Je peux le faire en 1! Supprimez simplement tous les caractères de nouvelle ligne dans le fichier source.
La bibliothèque de Google goyave a également ce genre de capacité . Vous pouvez également voir l'exemple String [] dans l'API.
Comme déjà décrit dans l'API, méfiez-vous de l'immuabilité des méthodes de construction.
Il peut accepter un tableau d'objets afin que cela fonctionne dans votre cas. Dans mon expérience précédente, j'ai essayé de rejoindre une pile qui est un itérable et cela fonctionne très bien.
Pas dans le noyau, non. Une recherche de "colle de chaîne de jonction de tableau java" vous donnera quelques extraits de code sur la façon d'y parvenir.
Utilisez StringBuilder (non thread-safe) à la place de StringBuffer (thread-safe) pour de meilleures performances. L'interface est la même.
Asaph
2
Cela semble provenir de snippets.dzone.com/posts/show/91 . Les commentaires suggèrent une version bien améliorée: jointure de chaîne statique publique (Iterable <? Étend l'objet> pColl, séparateur de chaîne) {Iterator <? étend Object> oIter; if (pColl == null || (! (oIter = pColl.iterator ()) .hasNext ())) return ""; StringBuilder oBuilder = nouveau StringBuilder (String.valueOf (oIter.next ())); while (oIter.hasNext ()) oBuilder.append (séparateur) .append (oIter.next ()); return oBuilder.toString (); }
Quantum7
6
Si vous avez atterri ici à la recherche d'une conversion rapide de tableau en chaîne, essayez Arrays.toString () .
Crée une représentation String du Object[]passé. Le résultat est entouré de crochets ( "[]"), chaque élément est converti en une chaîne via le String.valueOf(Object)et séparé par ", ". Si le tableau l'est
null, alors "null"est retourné.
MERCI BEAUCOUP! Les cordes sont séparées par "," et le tout a "[]" autour, ce qui me convient.
John Henckel,
5
Juste pour le défi "J'ai le plus court" , voici les mines;)
Itératif:
publicstaticString join(String s,Object... a){StringBuilder o =newStringBuilder();for(Iterator<Object> i =Arrays.asList(a).iterator(); i.hasNext();)
o.append(i.next()).append(i.hasNext()? s :"");return o.toString();}
Aimez-vous ma façon de 3 lignes en utilisant uniquement les méthodes de la classe String?
staticStringjoin(String glue,String[] array){String line ="";for(String s : array) line += s + glue;return(array.length ==0)? line : line.substring(0, line.length()- glue.length());}
Dans le cas où vous utilisez la bibliothèque Java fonctionnelle et pour une raison quelconque, vous ne pouvez pas utiliser les flux de Java 8 (ce qui pourrait être le cas lorsque vous utilisez le plug-in Android + Retrolambda), voici une solution fonctionnelle pour vous:
Cela ne fonctionne qu'avec des délimiteurs de longueur 1 et nécessite des «nombres magiques» (bien que très locaux) si vous vouliez un délimiteur de longueur différente.
maiwald
Vous pouvez ajouter plusieurs caractères lors de l'ajout
Gaurav Adurkar
que simplement faire: op = op.substring (0, op.length () - ",". length ()); quel est le gros problème?
Dennis
-3
java.util.Arrays a une méthode 'asList'. Avec l'API java.util.List / ArrayList, cela vous donne tout ce dont vous avez besoin :;
privatestaticString[]join(String[] array1,String[] array2){List<String> list =newArrayList<String>(Arrays.asList(array1));
list.addAll(Arrays.asList(array2));return list.toArray(newString[0]);}
Réponses:
À partir de Java8, il est possible d'utiliser
String.join()
.Génère:
Sinon, Apache Commons Lang a une
StringUtils
classe qui a unejoin
fonction qui réunira les tableaux pour faire unString
.Par exemple:
Génère les éléments suivants
String
:la source
String.join()
méthode introduite dans Java 8. De cette façon, le grand nombre de personnes lisant cette réponse acceptée bénéficiera de cette connaissance. Actuellement, la réponse la plus votée mentionnant ce fait est plutôt perdue ci-dessous ...String.join()
ne fonctionnerait que pour les élémentsList<CharSequence>
ouCharSequence[]
.Si vous cherchiez quoi utiliser dans Android, c'est:
par exemple:
la source
Dans Java 8, vous pouvez utiliser
1) API de diffusion:
2) nouvelle méthode String.join: https://stackoverflow.com/a/21756398/466677
3) Classe java.util.StringJoiner: http://docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html
la source
Vous pouvez facilement écrire une telle fonction dans une dizaine de lignes de code:
la source
Un petit mod au lieu d'utiliser substring ():
la source
.append()
deux fois pour chacunString
au lieu de les concaténer puis de les ajouter au générateur.Comme pour de nombreuses questions ces derniers temps, Java 8 à la rescousse:
Java 8 a ajouté une nouvelle méthode statique
java.lang.String
qui fait exactement ce que vous voulez:En l'utilisant:
Résulte en:
la source
La bibliothèque de Google goyave a également ce genre de capacité . Vous pouvez également voir l'exemple String [] dans l'API.
Comme déjà décrit dans l'API, méfiez-vous de l'immuabilité des méthodes de construction.
Il peut accepter un tableau d'objets afin que cela fonctionne dans votre cas. Dans mon expérience précédente, j'ai essayé de rejoindre une pile qui est un itérable et cela fonctionne très bien.
Échantillon de moi:
imprime:
|i am a coder|
la source
Donné:
Ensuite, comme alternative à la réponse de coobird, où la colle est ",":
Ou pour concaténer avec une chaîne différente, telle que "& amp;".
Cependant ... celui-ci fonctionne UNIQUEMENT si vous savez que les valeurs du tableau ou de la liste NE contiennent PAS la chaîne de caractères ",".
la source
Arrays.asList(a).toString()
travaillé pour ce que je voulais faireSi vous utilisez Spring Framework, vous disposez de la classe StringUtils :
la source
Pas dans le noyau, non. Une recherche de "colle de chaîne de jonction de tableau java" vous donnera quelques extraits de code sur la façon d'y parvenir.
par exemple
la source
Si vous avez atterri ici à la recherche d'une conversion rapide de tableau en chaîne, essayez Arrays.toString () .
la source
Juste pour le défi "J'ai le plus court" , voici les mines;)
Itératif:
Récursif:
la source
copyOfRange()
").Rien de intégré que je sache.
Apache Commons Lang a une classe appelée
StringUtils
qui contient de nombreuses fonctions de jointure.la source
Voilà comment je le fais.
la source
Une alternative similaire
la source
Mon tour.
la source
Aimez-vous ma façon de 3 lignes en utilisant uniquement les méthodes de la classe String?
la source
StringBuilder
si vous avez besoin d'efficacité: PPour obtenir "str1, str2" à partir de "str1", "str2", "":
Vous pouvez également ajouter un contrôle nul supplémentaire
la source
Dans le cas où vous utilisez la bibliothèque Java fonctionnelle et pour une raison quelconque, vous ne pouvez pas utiliser les flux de Java 8 (ce qui pourrait être le cas lorsque vous utilisez le plug-in Android + Retrolambda), voici une solution fonctionnelle pour vous:
Notez que ce n'est pas l'approche la plus efficace, mais cela fonctionne bien pour les petites listes.
la source
Je le fais de cette façon en utilisant un StringBuilder:
la source
s + delimiter
(concaténation de chaînes avec l'opérateur plus) annule tout le but de l'utilisation de aStringBuilder
.la source
java.util.Arrays a une méthode 'asList'. Avec l'API java.util.List / ArrayList, cela vous donne tout ce dont vous avez besoin :;
la source