Supposons que j'ai un tableau:
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
Et je dois joindre ses éléments en utilisant un séparateur, par exemple, " - "
. Ainsi, le résultat devrait être une chaîne comme celle-ci:
"1 - 2 - 3 - 4 - 5 - 6 - 7"
Comment pourrais-je faire ça?
PS: oui, je connais les posts de this et this , mais ses solutions ne fonctionneront pas avec un tableau de primitives.
Voici ce que je suis venu avec. Il y a plusieurs façons de le faire et cela dépend des outils que vous utilisez.
Utiliser StringUtils
et ArrayUtils
de Common Lang :
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = StringUtils.join(ArrayUtils.toObject(arr), " - ");
Vous ne pouvez pas simplement utiliser StringUtils.join(arr, " - ");
car StringUtils
ne possède pas cette version surchargée de la méthode. Cependant, il a la méthode StringUtils.join(int[], char)
.
Fonctionne sur toutes les versions de Java, à partir de 1.2.
Utilisation de flux Java 8:
Quelque chose comme ça:
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = Arrays.stream(arr)
.mapToObj(String::valueOf)
.collect(Collectors.joining(" - "));
En fait, il existe de nombreuses variantes pour obtenir le résultat en utilisant des flux.
La méthode String.join()
de Java 8 ne fonctionne qu'avec les chaînes, de sorte que vous devez toujours convertir int[]
en String[]
pour l'utiliser.
String[] sarr = Arrays.stream(arr).mapToObj(String::valueOf).toArray(String[]::new);
String result = String.join(" - ", sarr);
Si vous êtes bloqué avec Java 7 ou une version antérieure sans bibliothèque, vous pouvez écrire votre propre méthode utilitaire:
public static String myJoin(int[] arr, String separator) {
if (null == arr || 0 == arr.length) return "";
StringBuilder sb = new StringBuilder(256);
sb.append(arr[0]);
//if (arr.length == 1) return sb.toString();
for (int i = 1; i < arr.length; i++) sb.append(separator).append(arr[i]);
return sb.toString();
}
Que vous pouvez faire:
int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = myJoin(arr, " - ");
En Java 8+, vous pouvez utiliser IntStream
et StringJoiner
. Quelque chose comme,
int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };
StringJoiner sj = new StringJoiner(" - ");
IntStream.of(arr).forEach(x -> sj.add(String.valueOf(x)));
System.out.println(sj.toString());
La sortie est (comme demandé)
1 - 2 - 3 - 4 - 5 - 6 - 7
Vous pouvez utiliser la goyave pour joindre des éléments. Vous trouverez d'autres exemples et documents sur ce site. https://github.com/google/guava/wiki/StringsExplained
Joiner.on("-")
.join(texts);
Pour être plus précis, vous devriez d’abord enrouler votre tableau dans une List
avec Arrays.asList()
ou Guava's primitive-friendly équivalents.
Joiner.on("-")
.join(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
Joiner.on("-")
.join(Ints.asList(arr));
Je suis sûr qu'il existe un moyen de faire cela en Kotlin/Scala ou dans d'autres langages JVM, mais vous pouvez toujours garder les choses simples pour un petit ensemble de valeurs comme celles que vous avez ci-dessus:
int i, arrLen = arr.length;
StringBuilder tmp = new StringBuilder();
for (i=0; i<arrLen-1; i++)
tmp.append(arr[i] +" - ");
tmp.append(arr[arrLen-1]);
System.out.println( tmp.toString() );
La solution Java 8 ressemblerait à ceci:
Stream.of(1,2,3,4).map(String::valueOf).collect(Collectors.joining("-"))
J'ai cherché un moyen de joindre des primitives dans un flux sans d'abord instancier des chaînes pour chacune d'entre elles. J'y suis venu mais il faut quand même les boxer.
LongStream.range(0, 500).boxed().collect(Collector.of(StringBuilder::new, (sb, v) -> {
if (sb.length() != 0)
sb.append(',');
sb.append(v.longValue());
}, (a, b) -> a.length() == 0 ? b : b.length() != 0 ? a.append(',').append(b) : a, StringBuilder::toString));
int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };
IntStream.of(arr).mapToObj(i -> String.valueOf(i)).collect(Collectors.joining(",")) ;