2016-07-17 3 views
15

On suppose, j'ai un tableau:Java: rejoignez gamme de primitives avec séparateur

int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7}; 

Et je dois rejoindre ses éléments en utilisant le séparateur, par exemple, " - ", de sorte que le résultat que je devrais obtenir la chaîne comme celui-ci :

"1 - 2 - 3 - 4 - 5 - 6 - 7" 

Comment est-ce que je pourrais faire ceci?

PS: oui, je sais sur this et this messages, mais ses solutions ne fonctionnent pas avec un tableau de primitives.

Répondre

31

Voici ce que j'ai trouvé. Il existe plusieurs façons de le faire et elles dépendent des outils que vous utilisez.


En utilisant 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, " - "); parce StringUtils n'a pas cette version surchargée de la méthode. Cependant, il a la méthode StringUtils.join(int[], char).

Fonctionne avec n'importe quelle version Java, à partir de la version 1.2.


Utilisation de Java 8 flux:

Quelque chose comme ceci:

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 y a beaucoup de variations à ACHIVE le résultat en utilisant des flux.

La méthode String.join() de Java 8 fonctionne uniquement avec des chaînes de caractères, donc pour l'utiliser, vous devez toujours convertir int[] en String[].

String[] sarr = Arrays.stream(arr).mapToObj(String::valueOf).toArray(String[]::new); 
String result = String.join(" - ", sarr); 

Si vous coincé avec Java 7 ou plus tôt sans bibliothèques, 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, " - "); 
+1

Vous pouvez '.collect (Collectors.joining (", "))' à la place du tableau de chaînes temp. – shmosel

+2

Belle vue d'ensemble! Pour la version java 1.7: Techniquement, vous n'avez pas besoin de la vérification arr.length == 1 avant la boucle, mais cela fonctionne parfaitement. – n247s

+0

@shmosel, non. 'Arrays.stream (arr)' produit un 'IntStream' et il n'y a pas de telle méthode' collect() '. – spirit

3

Vous peut utiliser Goyave pour joindre des éléments. Plus d'exemples et de documents que vous pouvez trouver ici. https://github.com/google/guava/wiki/StringsExplained

Joiner.on("-") 
     .join(texts); 

Pour être plus précis, vous devez tout d'abord envelopper votre tableau dans un List avec Arrays.asList() ou primitive-friendly équivalents de Goyave.

Joiner.on("-") 
     .join(Arrays.asList(1, 2, 3, 4, 5, 6, 7)); 

Joiner.on("-") 
     .join(Ints.asList(arr)); 
+2

Pour les tableaux primitifs Gava fournit des méthodes '.asList()' primitives, par ex. ['Ints.asList()'] (https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/primitives/Ints.html#asList (int ...)) - vous ne pouvez pas utiliser 'Array.asList()' avec des tableaux primitifs. – dimo414

+0

ok, mon mauvais corrigera moi-même – RMachnik

+0

yep, 'Arrays.asList (arr)' produira un 'List' avec la taille de 1 =) Et c'est un élément sera notre tableau primitif. – spirit

7

En Java 8+, vous pouvez utiliser un IntStream et un 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()); 

sortie est (comme demandé)

1 - 2 - 3 - 4 - 5 - 6 - 7 
+0

un bon! Comme je l'ai dit, il y a beaucoup de façons de le faire via les flux. – spirit

2

Je suis sûr qu'il ya une façon de le faire dans Kotlin/Scala ou d'autres langages JVM aussi bien, mais vous pouvez toujours coller à garder des choses simples pour un petit ensemble de valeurs comme 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()); 
0

int [] arr = new int [] {1, 2, 3, 4, 5, 6, 7};

IntStream de (arr) .mapToObj (i -> String.valueOf (i)). Collect (Collectors.joining (","));