Ben bir tutkal dize ile bir String[]
katılmak istiyorum. Bunun için bir işlevi var mı?
Apache Commons Lang a StringUtils
class which has a join
function which will join arrays together to make a String
vardır.
Örneğin:
StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")
Aşağıdaki oluşturur String
,
Hello, World, !
Böyle bir fonksiyon yazabiliriz:
String combine(String[] s, String glue)
{
int k = s.length;
if ( k == 0 )
{
return null;
}
StringBuilder out = new StringBuilder();
out.append( s[0] );
for ( int x=1; x < k; ++x )
{
out.append(glue).append(s[x]);
}
return out.toString();
}
Edit: Bunu ya bir dizi ya da dizeleri virgülle ayrılmış listesini geçebileceği böylece daha iyi bir imza, (String tutkal, String ... s) birleştirmek olabilir.
Google Guava kütüphane de var this kind of capability. Sen API de String [] örnek görebilirsiniz.
Zaten API de tarif edildiği gibi, güçlendirici yöntemlerin değişmezlik dikkat.
Bu durumda çalışmıyor, bu sayede nesneleri dizisi kabul edebilir. Benim önceki deneyim, ben bir iterable ve gayet iyi çalışıyor bir Stack katılmadan çalıştı.
Benden Örnek:
Deque<String> nameStack = new ArrayDeque<>();
nameStack.push("a coder");
nameStack.push("i am");
System.out.println("|" + Joiner.on(' ').skipNulls().join(nameStack) + "|");
yazdırır: |i am a coder|
Eğer Spring Framework kullanıyorsanız o zaman StringUtils sınıf vardır:
import static org.springframework.util.StringUtils.arrayToDelimitedString;
arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n");
Değil çekirdek, hayır. Için bir arama size bu olsa nasıl ulaşılacağı konusunda bazı kod vereceğiz "java dizi dize tutkal katılın".
örneğin
public static String join(Collection s, String delimiter) {
StringBuffer buffer = new StringBuffer();
Iterator iter = s.iterator();
while (iter.hasNext()) {
buffer.append(iter.next());
if (iter.hasNext()) {
buffer.append(delimiter);
}
}
return buffer.toString();
}
Verilen:
String[] a = new String[] { "Hello", "World", "!" };
Daha sonra bir yapıştırıcıdır cevabını, coobird alternatif olarak ",":
Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "")
Ya da "&" gibi farklı bir dizeyle birleştirmek için.
Arrays.asList(a).toString().replaceAll(", ", " & ").replaceAll("^\\[|\\]$", "")
Eğer dizi veya listedeki değerleri karakter dizesi "," içeren YAPMAYIN olduğunu biliyorum ... Ancak bu bir SADECE çalışır.
Bu bunu nasıl olduğunu.
private String join(String[] input, String delimiter)
{
StringBuilder sb = new StringBuilder();
for(String value : input)
{
sb.append(value);
sb.append(delimiter);
}
int length = sb.length();
if(length > 0)
{
// Remove the extra delimiter
sb.setLength(length - delimiter.length());
}
return sb.toString();
}
Eğer hızlı bir dizi-dize dönüşümünde aramak için buraya indi ettiyseniz, Arrays.toString() a> deneyin.
Creates a String representation of the
Object[]
passed. The result is surrounded by brackets ("[]"
), each element is converted to a String via theString.valueOf(Object)
and separated by", "
. If the array isnull
, then"null"
is returned.
Hiçbir şey dahili ben biliyorum.
Apache Commons Lang birçok işlevleri katılmak içerir StringUtils
a> adında bir sınıfı vardır.
Sadece "I've the shortest one" meydan için, burada mayın vardır ;)
Iterative:
public static String join(String s, Object... a) {
StringBuilder o = new StringBuilder();
for (Iterator<Object> i = Arrays.asList(a).iterator(); i.hasNext();)
o.append(i.next()).append(i.hasNext() ? s : "");
return o.toString();
}
Recursive:
public static String join(String s, Object... a) {
return a.length == 0 ? "" : a[0] + (a.length == 1 ? "" : s + join(s, Arrays.copyOfRange(a, 1, a.length)));
}
Java'da 8 kullanabilirsiniz
1) Akış API:
String[] a = new String[] {"a", "b", "c"};
String result = Arrays.stream(a).collect(Collectors.joining(", "));
2) yeni String.Join yöntemi: http://stackoverflow.com/a/21756398/466677
3) java.util.StringJoiner sınıfı: http://docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html
Benzer bir alternatif
/**
* @param delimiter
* @param inStr
* @return String
*/
public static String join(String delimiter, String... inStr)
{
StringBuilder sb = new StringBuilder();
if (inStr.length > 0)
{
sb.append(inStr[0]);
for (int i = 1; i < inStr.length; i++)
{
sb.append(delimiter);
sb.append(inStr[i]);
}
}
return sb.toString();
}
Ben bunu bir StringBuilder kullanarak bu şekilde yapın:
public static String join(String[] source, String delimiter) {
if ((null == source) || (source.length < 1)) {
return "";
}
StringBuilder stringbuilder = new StringBuilder();
for (String s : source) {
stringbuilder.append(s + delimiter);
}
return stringbuilder.toString();
} // join((String[], String)
java.util.Arrays bir 'asList' yöntemi vardır. Birlikte java.util.List / ArrayList API ile bu size ihtiyacınız olan tüm verir:;
private static String[] join(String[] array1, String[] array2) {
List<String> list = new ArrayList<String>(Arrays.asList(array1));
list.addAll(Arrays.asList(array2));
return list.toArray(new String[0]);
}