在java中使用数组分隔符(拆分相反)的快速简便方法

A quick and easy way to join array elements with a separator (the opposite of split) in Java

本问题已经有最佳答案,请猛点这里访问。

参见相关的.NET问题

我正在寻找一种快速简便的方法来做与分裂完全相反的事情从而使["a","b","c"]成为"a,b,c"

迭代数组需要添加一个条件(如果这不是最后一个元素,请添加分隔符)或使用子字符串删除最后一个分隔符。

我确信有一种经过认证的、有效的方法可以做到这一点(ApacheCommons?)

你喜欢在你的项目中做什么?


使用Java,你可以在我这8路:很洁净P></

1
String.join(delimiter, elements);

本厂在三种:P></

1)directly元素specifying theP></

1
String joined1 = String.join(",","a","b","c");

2)使用arraysP></

1
2
String[] array = new String[] {"a","b","c" };
String joined2 = String.join(",", array);

3)使用迭代量P></

1
2
List<String> list = Arrays.asList(array);
String joined3 = String.join(",", list);


如果你在线,你可以TextUtils.join(delimiter, tokens)AndroidP></


喜欢谷歌的stringutils for this是collections过Apache的问题:P></

1
Joiner.on(separator).join(array)

compared stringutils has to the Joiner,在API设计和fluent is a位更多的柔性元素,例如nullor may be replaced by a placeholder纪录。also has a,Joinerfor joining with a separator地图特征之间的关键和价值。P></


Apache Commons郎真的StringUtils.joinmethod which does have a将连接在一起,在Stringarrays separator指定。P></

for example:P></

1
2
String[] s = new String[] {"a","b","c"};
String joined = StringUtils.join(s,",");  //"a,b,c"

不管一个人多,suspect that,as You拉提,there must be some kind of the actual前处理条件的子串?实现上述方法。P></

如果我做Stringjoining the to和不使用任何其他原因to have probably轧辊共用朗,我会自己减少the number of dependencies to external图书馆。P></


快速和简单的解决方案不包括任何第三方。P></

1
2
3
4
5
6
7
8
9
public static String strJoin(String[] aArr, String sSep) {
    StringBuilder sbStr = new StringBuilder();
    for (int i = 0, il = aArr.length; i < il; i++) {
        if (i > 0)
            sbStr.append(sSep);
        sbStr.append(aArr[i]);
    }
    return sbStr.toString();
}


"我认为there is to a注册,高效的方式做(Apache Commons?)"P></

是的,很显然地P></

1
StringUtils.join(array, separator)

http:/ / / / / www.java2s.com javaapi org.apache.commons.lang / stringutilsjoinobjectarraystringseparator.htm队列P></


你可以使用任何一easier arrays,知道你将得到的字符串with the values of the阵"、"separated byP></

1
String concat = Arrays.toString(myArray);

我知道你会端上with this concat=":[ ] A、B、C"P></

更新P></

然后你可以使用get rid of the brackets和杰夫suggested模式的子字符串P></

1
concat = concat.substring(1, concat.length() -1);

我知道你端上与concat ="A、B、C"P></


用Java stringjoiner there is在1.8级我need for Apache Commons:番石榴。P></

1
String str = new StringJoiner(",").add("a").add("b").add("c").toString();

directly with the collection或使用新的API流:P></

1
String str = Arrays.asList("a","b","c").stream().collect(Collectors.joining(","));


你可以使用正则表达式来替换?& replace with。P></

1
2
3
String[] strings = {"a","b","c"};

String result = Arrays.asList(strings).toString().replaceAll("(^\\[|\\]$)","").replace(",",",");

因为Arrays.asList().toString()produces:"[ ] a,b,c",我们给replaceAllto remove the first和last brackets和我(You can change the optionally)","序列","(你)New separator)。P></

在stripped version(fewer chars):P></

1
2
3
String[] strings = {"a","b","c"};

String result = ("" + Arrays.asList(strings)).replaceAll("(^.|.$)","").replace(",","," );

正则表达式是非常powerful,specially方法"和"replacefirst字符串替换?""。尝试给他们。P></


所有这些其他的答案,包括运行时的量。使用arraylist.tostring(类).replaceall which are甚wasteful(……)。P></

我会给你最优的算法与零量;它不漂亮面貌as as the other期权,but this is internally,他们是做什么的(piles of other隐检查后,多阵列配置和其他crud)。P></

因为你已经知道你是处理与保存的字符串,你可以帮of阵列分配模式表演的一切manually。这不是很漂亮,但如果你在the actual微量法自制by the other implementations,你会看到它has the possible运行量最小。P></

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public static String join(String separator, String ... values) {
  if (values.length==0)return"";//need at least one element
  //all string operations use a new array, so minimize all calls possible
  char[] sep = separator.toCharArray();

  // determine final size and normalize nulls
  int totalSize = (values.length - 1) * sep.length;// separator size
  for (int i = 0; i < values.length; i++) {
    if (values[i] == null)
      values[i] ="";
    else
      totalSize += values[i].length();
  }

  //exact size; no bounds checks or resizes
  char[] joined = new char[totalSize];
  int pos = 0;
  //note, we are iterating all the elements except the last one
  for (int i = 0, end = values.length-1; i < end; i++) {
    System.arraycopy(values[i].toCharArray(), 0,
      joined, pos, values[i].length());
    pos += values[i].length();
    System.arraycopy(sep, 0, joined, pos, sep.length);
    pos += sep.length;
  }
  //now, add the last element;
  //this is why we checked values.length == 0 off the hop
  System.arraycopy(values[values.length-1].toCharArray(), 0,
    joined, pos, values[values.length-1].length());

  return new String(joined);
}


这是快速和明确的选择:P></

1
2
3
4
5
6
7
8
9
10
11
12
  public static String join(String separator, String... values) {
    StringBuilder sb = new StringBuilder(128);
    int end = 0;
    for (String s : values) {
      if (s != null) {
        sb.append(s);
        end = sb.length();
        sb.append(separator);
      }
    }
    return sb.substring(0, end);
  }


这是在stringutils:P></

http:/ / / / / www.java2s.com javaapi org.apache.commons.lang / stringutilsjoinobjectarraystringseparator.htm队列P></


这永远是在方便的小功能。P></

1
2
3
4
5
6
7
8
public static String join(String[] strings, int startIndex, String separator) {
    StringBuffer sb = new StringBuffer();
    for (int i=startIndex; i < strings.length; i++) {
        if (i != startIndex) sb.append(separator);
        sb.append(strings[i]);
    }
    return sb.toString();
}

我已经采取的方法已经从Java 1发展起来,以提供可读性,并保持与旧的Java版本向后兼容的合理选择,同时还提供了从Apache Mux-Lang-Langes中替换的方法签名。出于性能的原因,我可以看到使用数组的一些可能的异议。.aslist,但我更喜欢具有合理默认值的助手方法,而不复制执行实际工作的方法。这种方法为可靠方法提供了适当的入口点,该方法在调用之前不需要数组/列表转换。

Java版本兼容性的可能变体包括将StringBuffer(Java 1)替换为StringBuilder(Java 1.5),切换Java 1.5迭代器,并从集合(Java 1.2)中移除通用通配符(Java 1.5)。如果要进一步向后兼容一两步,请删除使用集合的方法,并将逻辑移到基于数组的方法中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public static String join(String[] values)
{
    return join(values, ',');
}

public static String join(String[] values, char delimiter)
{
    return join(Arrays.asList(values), String.valueOf(delimiter));
}

// To match Apache commons-lang: StringUtils.join(values, delimiter)
public static String join(String[] values, String delimiter)
{
    return join(Arrays.asList(values), delimiter);
}

public static String join(Collection<?> values)
{
    return join(values, ',');
}

public static String join(Collection<?> values, char delimiter)
{
    return join(values, String.valueOf(delimiter));
}

public static String join(Collection<?> values, String delimiter)
{
    if (values == null)
    {
        return new String();
    }

    StringBuffer strbuf = new StringBuffer();

    boolean first = true;

    for (Object value : values)
    {
        if (!first) { strbuf.append(delimiter); } else { first = false; }
        strbuf.append(value.toString());
    }

    return strbuf.toString();
}

1
2
3
4
5
public String join(String[] str, String separator){
    String retval ="";
    for (String s: str){ retval+= separator + s;}
    return retval.replaceFirst(separator,"");
}