String[]
Bir yapıştırıcı ip ile katılmak istiyorum . Bunun için bir işlev var mı?
String[]
Bir yapıştırıcı ip ile katılmak istiyorum . Bunun için bir işlev var mı?
Yanıtlar:
Java8'den başlayarak kullanmak mümkündür String.join()
.
String.join(", ", new String[]{"Hello", "World", "!"})
üretir:
Hello, World, !
Aksi takdirde, Apache Commons Lang , dizileri birleştirmek için dizileri birleştirecek StringUtils
bir join
işlevi olan bir sınıfa sahiptir String
.
Örneğin:
StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")
Aşağıdakileri üretir String
:
Hello, World, !
String.join()
Java 8'de sunulan yeni yönteme referans eklemek için bu yanıtı düzenlemenizi tavsiye ederim . Bu şekilde, bu kabul edilen yanıtı okuyan çok sayıda insan bu bilgiden faydalanacaktır. Şu anda, bu gerçeği söyleyen en yüksek oy alan cevap aşağıda oldukça kayboluyor ...
String.join()
için işe yarayacağını belirtmek gerekir . List<CharSequence>
CharSequence[]
Android'de ne kullanacağınızı arıyorsanız, bu:
String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)
Örneğin:
String joined = TextUtils.join(";", MyStringArray);
Java 8'de şunları kullanabilirsiniz:
1) Akış API'sı:
String[] a = new String[] {"a", "b", "c"};
String result = Arrays.stream(a).collect(Collectors.joining(", "));
2) yeni String.join yöntemi: https://stackoverflow.com/a/21756398/466677
3) java.util.StringJoiner sınıfı: http://docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html
Böyle bir işlevi yaklaşık on kod satırına kolayca yazabilirsiniz:
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();
}
Substring () kullanmak yerine küçük bir mod:
//join(String array,delimiter)
public static String join(String r[],String d)
{
if (r.length == 0) return "";
StringBuilder sb = new StringBuilder();
int i;
for(i=0;i<r.length-1;i++){
sb.append(r[i]);
sb.append(d);
}
sb.append(r[i]);
return sb.toString();
}
.append()
her biri için iki kez kullanılır String
ve daha sonra üreticiye eklenirse daha iyi olur .
Son zamanlarda birçok soruda olduğu gibi, Java 8 kurtarmaya:
Java 8 java.lang.String
, tam olarak istediğinizi yapan yeni bir statik yöntem ekledi :
public static String join(CharSequence delimeter, CharSequence... elements);
Kullanma:
String s = String.join(", ", new String[] {"Hello", "World", "!"});
Sonuçlar:
"Hello, World, !"
Google guava'nın kütüphanesinde de bu tür bir yetenek vardır . String [] örneğini API'den de görebilirsiniz.
Api'de daha önce açıklandığı gibi, oluşturucu yöntemlerin değişmezliğine dikkat edin.
Bir nesne dizisini kabul edebilir, böylece sizin durumunuzda çalışır. Önceki deneyimlerime göre, bir yinelenebilir bir yığın katılmaya çalıştım ve iyi çalışıyor.
Benden örnek:
Deque<String> nameStack = new ArrayDeque<>();
nameStack.push("a coder");
nameStack.push("i am");
System.out.println("|" + Joiner.on(' ').skipNulls().join(nameStack) + "|");
çıktılar: |i am a coder|
Verilen:
String[] a = new String[] { "Hello", "World", "!" };
Daha sonra, yapıştırıcının "," olduğu coobird cevabına alternatif olarak:
Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "")
Veya "& amp;" gibi farklı bir dizeyle birleştirmek için.
Arrays.asList(a).toString().replaceAll(", ", " & ").replaceAll("^\\[|\\]$", "")
Ancak ... bu SADECE dizi veya listedeki değerlerin "," karakter dizesini İÇERMEDİĞİNİ biliyorsanız çalışır.
Arrays.asList(a).toString()
ne yapmak istediğim için çalıştı
Spring Framework kullanıyorsanız, o zaman StringUtils sınıfına sahipsiniz :
import static org.springframework.util.StringUtils.arrayToDelimitedString;
arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n");
Özünde değil, hayır. "Java dizi birleştirme dizesi tutkal" için bir arama size bunu nasıl olsa bazı kod parçacıkları verecektir.
Ö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();
}
Buraya hızlı bir dizi-dize dönüştürme araması yaptıysanız , Arrays.toString () yöntemini deneyin .
Object[]
Geçirilenin bir Dize temsilini oluşturur . Sonuç parantez ("[]"
) ile çevrelenir , her öğeString.valueOf(Object)
ve aracılığıyla bir String'e dönüştürülür", "
. Dizi isenull
, o"null"
zaman döndürülür.
Sadece "Ben en kısa olanım" meydan okuma için, burada mayın;)
yinelemeli:
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();
}
özyineli:
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)));
}
copyOfRange()
").
Bildiğim yerleşik bir şey yok.
Apache Commons Lang , StringUtils
birçok birleştirme işlevi içeren bir sınıfa sahiptir .
Ben böyle yaparım.
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();
}
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();
}
Dönüşüm.
public static String join(Object[] objects, String delimiter) {
if (objects.length == 0) {
return "";
}
int capacityGuess = (objects.length * objects[0].toString().length())
+ ((objects.length - 1) * delimiter.length());
StringBuilder ret = new StringBuilder(capacityGuess);
ret.append(objects[0]);
for (int i = 1; i < objects.length; i++) {
ret.append(delimiter);
ret.append(objects[i]);
}
return ret.toString();
}
public static String join(Object... objects) {
return join(objects, "");
}
Yalnızca String sınıfının yöntemlerini kullanarak 3 satırlı yolumu beğendiniz mi?
static String join(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());
}
StringBuilder
Verimliliğe ihtiyacınız varsa kullanın : P
İşlevsel Java kitaplığını kullanıyorsanız ve herhangi bir nedenle Java 8'den Akışları kullanamıyorsanız (Android + Retrolambda eklentisini kullanırken durum böyle olabilir), işte size uygun bir çözüm:
String joinWithSeparator(List<String> items, String separator) {
return items
.bind(id -> list(separator, id))
.drop(1)
.foldLeft(
(result, item) -> result + item,
""
);
}
En etkili yaklaşım olmadığını, ancak küçük listeler için iyi çalıştığını unutmayın.
Bir StringBuilder kullanarak bu şekilde yaparım:
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)
s + delimiter
(artı işleci ile dize birleştirme) a StringBuilder
.
Çoğu zaman kullandığım basit stenografi tekniği var ..
String op = new String;
for (int i : is)
{
op += candidatesArr[i-1]+",";
}
op = op.substring(0, op.length()-1);
java.util.Arrays 'asList' yöntemine sahiptir. Java.util.List / ArrayList API ile birlikte size ihtiyacınız olan her şeyi sunar :;
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]);
}