簡體   English   中英

Java function 對於 arrays 像 PHP 的 join()?

[英]Java function for arrays like PHP's join()?

我想用膠水字符串加入String[] 這個有 function 嗎?

Java8開始,可以使用String.join()

String.join(", ", new String[]{"Hello", "World", "!"})

產生:

Hello, World, !

否則, Apache Commons Lang有一個StringUtils類,它有一個join函數,可以將數組連接在一起形成一個String

例如:

StringUtils.join(new String[] {"Hello", "World", "!"}, ", ")

生成以下String

Hello, World, !

如果您正在尋找在 android 中使用什么,它是:

String android.text.TextUtils.join(CharSequence delimiter, Object[] tokens)

例如:

String joined = TextUtils.join(";", MyStringArray);

在 Java 8 中,您可以使用

1)流API:

String[] a = new String[] {"a", "b", "c"};
String result = Arrays.stream(a).collect(Collectors.joining(", "));

2)新的String.join方法: https ://stackoverflow.com/a/21756398/466677

3) java.util.StringJoiner 類: http : //docs.oracle.com/javase/8/docs/api/java/util/StringJoiner.html

你可以很容易地用大約十行代碼編寫這樣一個函數:

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

一個小的 mod 而不是使用 substring():

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

與最近的許多問題一樣,Java 8 來拯救:


Java 8 向java.lang.String添加了一個新的靜態方法,它完全符合您的要求:

public static String join(CharSequence delimeter, CharSequence... elements);

使用它:

String s = String.join(", ", new String[] {"Hello", "World", "!"});

結果是:

"Hello, World, !"

Google guava 的庫也有這種能力 您也可以從 API 中看到 String[] 示例。

正如 api 中已經描述的那樣,要注意構建器方法的不變性。

它可以接受一組對象,因此它適用於您的情況。 在我之前的經驗中,我嘗試加入一個可迭代的 Stack,它工作正常。

我的樣品:

Deque<String> nameStack = new ArrayDeque<>();
nameStack.push("a coder");
nameStack.push("i am");
System.out.println("|" + Joiner.on(' ').skipNulls().join(nameStack) + "|");

打印出: |i am a coder|

如果您使用的是Spring Framework,那么您將擁有StringUtils類:

import static org.springframework.util.StringUtils.arrayToDelimitedString;

arrayToDelimitedString(new String[] {"A", "B", "C"}, "\n");

鑒於:

String[] a = new String[] { "Hello", "World", "!" };

然后作為 coobird 答案的替代,其中膠水是“,”:

Arrays.asList(a).toString().replaceAll("^\\[|\\]$", "")

或者連接不同的字符串,例如“ &amp; ”。

Arrays.asList(a).toString().replaceAll(", ", " &amp; ").replaceAll("^\\[|\\]$", "")

但是……只有當您知道數組或列表中的值不包含字符串“,”時,此方法才有效。

不在核心,不。 搜索“java array join string paste”將為您提供一些關於如何實現這一點的代碼片段。

例如

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

如果您來到這里尋找快速的數組到字符串轉換,請嘗試Arrays.toString()

創建傳遞的Object[]的字符串表示形式。 結果用方括號 ( "[]" ) 括起來,每個元素通過String.valueOf(Object)轉換為 String 並用", "分隔。 如果數組為null ,則返回"null"

只是為了“我有最短的”挑戰,這里有我的 ;)

迭代:

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

遞歸:

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

我所知道的沒有內置的東西。

Apache Commons Lang有一個名為StringUtils的類,它包含許多連接函數。

我就是這樣做的。

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

一個類似的選擇

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

我的旋轉。

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, "");
}

你喜歡我只使用 String 類的方法的 3 行方式嗎?

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

要從 "str1", "str2", "" 獲取 "str1, str2" :

Stream.of("str1", "str2", "").filter(str -> !str.isEmpty()).collect(Collectors.joining(", ")); 

您也可以添加額外的空檢查

如果您正在使用 Functional Java 庫並且由於某種原因不能使用來自 Java 8 的 Streams(使用 Android + Retrolambda 插件時可能會出現這種情況),這里有一個功能解決方案供您使用:

String joinWithSeparator(List<String> items, String separator) {
    return items
            .bind(id -> list(separator, id))
            .drop(1)
            .foldLeft(
                    (result, item) -> result + item,
                    ""
            );
}

請注意,這不是最有效的方法,但它確實適用於小型列表。

無論您選擇哪種方法,都要注意數組中的空值。 它們的字符串表示為“null”,因此如果這不是您想要的行為,請跳過 null 元素。

String[] parts = {"Hello", "World", null, "!"};
Stream.of(parts)
      .filter(Objects::nonNull)
      .collect(Collectors.joining(" "));

如前所述,class StringJoiner也是一個可用選項,因為 Java 8:

@NotNull
String stringArrayToCsv(@NotNull String[] data) {
    if (data.length == 0) {return "";}
    StringJoiner joiner = new StringJoiner(", ");
    Iterator<String> itr = Arrays.stream(data).iterator();
    while (itr.hasNext()) {joiner.add(itr.next());}
    return joiner.toString();
}

但是,傳統的String.join()導入更少,代碼更少:

@NotNull
String stringArrayToCsv(@NotNull String[] data) {
    if (data.length == 0) {return "";}
    return String.join(", ", data);
}

我使用 StringBuilder 這樣做:

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)

我大部分時間都使用簡單的速記技巧。

String op = new String;
for (int i : is) 
{
    op += candidatesArr[i-1]+",";
}
op = op.substring(0, op.length()-1);

java.util.Arrays 有一個“asList”方法。 與 java.util.List/ArrayList API 一起為您提供所需的一切:;

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM