Java:

2016-07-17 16 views
15

varsayalım ayırıcı ile ilkel dizi katılmak, bir dizi var:Java:

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

Ve sonuç olarak böyle dize almalısınız yüzden, örneğin, " - " için, ayırıcı kullanarak öğelerini katılması gerekir :

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

Bunu nasıl yapabilirim?

PS: evet, ben yaklaşık this ve this Mesajları biliyorum ama onun çözümler ilkel bir dizi çalışmaz.

cevap

31

Burada neyle karşılaştım. Bunu yapmanın birkaç yolu vardır ve bunlar kullandığınız araçlara bağlıdır. Common Lang den StringUtils ve ArrayUtils kullanma


:

int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7}; 
String result = StringUtils.join(ArrayUtils.toObject(arr), " - "); 

sadece StringUtils.join(arr, " - ");StringUtils çünkü kullanamaz yöntemin bu aşırı sürümü yok. Yine de, StringUtils.join(int[], char) yöntemine sahiptir.

Herhangi bir Java sürümünde, 1.2'den çalışır.


kullanma Java 8 akışları: Böyle

şey:

int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7}; 
String result = Arrays.stream(arr) 
     .mapToObj(String::valueOf) 
     .collect(Collectors.joining(" - ")); 

Aslında akışları kullanarak sonuca ulaşmada varyasyonların yeri vardır. dizeleri ile çalışır String.join()

Java 8'in metodu, böylece yine String[] için int[] dönüştürmek zorunda kullanmak.

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

sen, kendi yarar yöntem yazabilirsiniz önce hiçbir kütüphanelerle Java 7 veya kullanarak sıkışmış ise:

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(); 
} 

Yapabileceğiniz daha:

int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7}; 
String result = myJoin(arr, " - "); 
+1

Geçici dizin dizisi yerine .collect (Collectors.joining (",")) 'dır. – shmosel

+2

Güzel bakış! Java 1.7 sürümü için: Teknik olarak arr.length == 1 döngüsünden önce kontrol etmenize gerek yok ama bu da mükemmel çalışıyor. – n247s

+0

@shmosel, nope. 'Arrays.stream (arr) 'bir“ IntStream ”üretir ve içinde böyle bir' collect() 'yöntemi yoktur. – spirit

3

You Guava'yı elementleri birleştirmek için kullanabilir. Orada bulabileceğiniz diğer örnekler ve dokümanlar.

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

https://github.com/google/guava/wiki/StringsExplained size öncelikle Arrays.asList() veya Guava en primitive-friendly eşdeğerleriyle bir List içine dizi yerleştirilmeli daha kesin olmak gerekirse. Java'da

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

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

İlkel diziler için Gava, ilkel '.asList() yöntemlerini, ör. [ 'Ints.asList()'] (https://google.github.io/guava/releases/snapshot/api/docs/com/google/common/primitives/Ints.html#asList (int ...)) - Array.asList() işlevini ilkel dizilerle kullanamazsınız. – dimo414

+0

tamam, benim hatam kendimi düzeltir – RMachnik

+0

yep, 'Arrays.asList (arr)' 1 = boyutuna sahip bir 'List 'üretecek. Ve bu bir element ilkel dizimiz olacak. – spirit

7

bir IntStream ve StringJoiner kullanabilirsiniz 8+.Bir şey gibi

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()); 

Çıktı Ben de Kotlin/Scala veya diğer JVM dillerinde bunu yapmanın bir yolu olmadığına emin değilim ama her zaman tutmak sopa olabilir (istendiği gibi)

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

iyi biri! Dediğim gibi, bunu akımlar aracılığıyla yapmanın birçok yolu var. – spirit

2

olduğunu sizin gibi, küçük bir değer kümesi için basit şeyler üzerinde vardır:

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 [] dizi = new int [] {1, 2, 3, 4, 5, 6, 7};

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