java:将list< string>转换为字符串

70gysomp  于 2021-07-12  发布在  Java
关注(0)|答案(22)|浏览(980)

javascript有 Array.join() ```
js>["Bill","Bob","Steve"].join(" and ")
Bill and Bob and Steve

java有这样的东西吗?我知道我可以用stringbuilder自己拼凑一些东西:

static public String join(List list, String conjunction)
{
StringBuilder sb = new StringBuilder();
boolean first = true;
for (String item : list)
{
if (first)
first = false;
else
sb.append(conjunction);
sb.append(item);
}
return sb.toString();
}

…但如果类似的东西已经是jdk的一部分,那么这样做就没有意义了。
kzipqqlq

kzipqqlq1#

您可以使用apachecommons库,它有一个stringutils类和一个join方法。
检查此链接:https://commons.apache.org/proper/commons-lang/javadocs/api.2.0/org/apache/commons/lang/stringutils.html
请注意,上面的链接可能会随着时间的推移而过时,在这种情况下,您只需在web上搜索“ApacheCommonsStringUtils”,就可以找到最新的引用。
(从这个线程引用)c#string.format()和string.join()的java等价物

ql3eal8s

ql3eal8s2#

试试这个:

java.util.Arrays.toString(anArray).replaceAll(", ", ",")
                .replaceFirst("^\\[","").replaceFirst("\\]$","");
acruukt9

acruukt93#

您可以从spring框架的stringutils中使用它。我知道已经提到过了,但是实际上你可以直接使用这个代码,它可以立即工作,而不需要spring。

// from https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/main/java/org/springframework/util/StringUtils.java

/*
 * Copyright 2002-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
public class StringUtils {
    public static String collectionToDelimitedString(Collection<?> coll, String delim, String prefix, String suffix) {
        if(coll == null || coll.isEmpty()) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        Iterator<?> it = coll.iterator();
        while (it.hasNext()) {
            sb.append(prefix).append(it.next()).append(suffix);
            if (it.hasNext()) {
                sb.append(delim);
            }
        }
        return sb.toString();
    }
}
pxq42qpu

pxq42qpu4#

Java8确实带来了

Collectors.joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)

方法,通过使用 prefix + suffix 对于空值。
可按以下方式使用:

String s = stringList.stream().collect(Collectors.joining(" and ", "prefix_", "_suffix"))

这个 Collectors.joining(CharSequence delimiter) 方法只调用 joining(delimiter, "", "") 内部。

cetgtptt

cetgtptt5#

google的GuavaAPI也有.join(),不过(正如其他回复所显示的那样),ApacheCommons几乎是这里的标准。

dkqlctbz

dkqlctbz6#

可以使用Java1.8流,

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
List<String> list = Arrays.asList("Bill","Bob","Steve").
String str = list.stream().collect(Collectors.joining(" and "));
b1zrtrql

b1zrtrql7#

编辑
我也注意到 toString() 基本的实现问题,以及关于包含分隔符的元素,但我认为我有点偏执。
既然我对这一点有两点看法,我就把答案改为:

static String join( List<String> list , String replacement  ) {
    StringBuilder b = new StringBuilder();
    for( String item: list ) { 
        b.append( replacement ).append( item );
    }
    return b.toString().substring( replacement.length() );
}

看起来和原来的问题很相似。
因此,如果您不想将整个jar添加到您的项目中,您可以使用这个。
我认为你原来的代码没有问题。实际上,每个人建议的替代方案看起来几乎相同(尽管它做了许多额外的验证)
这是它,以及Apache2.0许可证。

public static String join(Iterator iterator, String separator) {
    // handle null, zero and one elements before building a buffer
    if (iterator == null) {
        return null;
    }
    if (!iterator.hasNext()) {
        return EMPTY;
    }
    Object first = iterator.next();
    if (!iterator.hasNext()) {
        return ObjectUtils.toString(first);
    }

    // two or more elements
    StringBuffer buf = new StringBuffer(256); // Java default is 16, probably too small
    if (first != null) {
        buf.append(first);
    }

    while (iterator.hasNext()) {
        if (separator != null) {
            buf.append(separator);
        }
        Object obj = iterator.next();
        if (obj != null) {
            buf.append(obj);
        }
    }
    return buf.toString();
}

现在我们知道了,谢谢开源

olqngx59

olqngx598#

如果您使用的是eclipse集合(以前称为gs集合),那么可以使用 makeString() 方法。

List<String> list = Arrays.asList("Bill", "Bob", "Steve");

String string = ListAdapter.adapt(list).makeString(" and ");

Assert.assertEquals("Bill and Bob and Steve", string);

如果你能把你的 List 对于eclipse集合类型,则可以去掉适配器。

MutableList<String> list = Lists.mutable.with("Bill", "Bob", "Steve");
String string = list.makeString(" and ");

如果只需要逗号分隔的字符串,可以使用 makeString() 不需要参数。

Assert.assertEquals(
    "Bill, Bob, Steve", 
    Lists.mutable.with("Bill", "Bob", "Steve").makeString());

注意:我是eclipse集合的提交者。

0lvr5msh

0lvr5msh9#

您可能需要尝试apache commons stringutils连接方法:
http://commons.apache.org/lang/api/org/apache/commons/lang/stringutils.html#join(java.util.iterator、java.lang.string)
我发现ApacheStringUtils可以弥补jdk的不足;-)

xnifntxz

xnifntxz10#

在一个职责范围内,使用纯jdk是一种有趣的方式:

String[] array = new String[] { "Bill", "Bob", "Steve","[Bill]","1,2,3","Apple ][" };
String join = " and ";

String joined = Arrays.toString(array).replaceAll(", ", join)
        .replaceAll("(^\\[)|(\\]$)", "");

System.out.println(joined);

输出:
比尔、鲍勃、史蒂夫和[比尔]还有1、2、3和苹果][
一种不太完美也不太有趣的方式!

String[] array = new String[] { "7, 7, 7","Bill", "Bob", "Steve", "[Bill]",
        "1,2,3", "Apple ][" };
String join = " and ";

for (int i = 0; i < array.length; i++) array[i] = array[i].replaceAll(", ", "~,~");
String joined = Arrays.toString(array).replaceAll(", ", join)
        .replaceAll("(^\\[)|(\\]$)", "").replaceAll("~,~", ", ");

System.out.println(joined);

输出:
7,7,7和比尔,鲍勃,史蒂夫和[比尔]还有1,2,3和苹果][

jjhzyzn0

jjhzyzn011#

您可以这样做:

String aToString = java.util.Arrays.toString(anArray);
// Do not need to do this if you are OK with '[' and ']'
aToString = aToString.substring(1, aToString.length() - 1);

或一行(仅当不需要“[”和“]”时)

String aToString = java.util.Arrays.toString(anArray).substring(1).replaceAll("\\]$", "");

希望这有帮助。

oknrviil

oknrviil12#

使用Java8,您可以在没有任何第三方库的情况下实现这一点。
如果要联接字符串集合,可以使用new string.join()方法:

List<String> list = Arrays.asList("foo", "bar", "baz");
String joined = String.join(" and ", list); // "foo and bar and baz"

如果集合的类型不是string,则可以将stream api与联接收集器一起使用:

List<Person> list = Arrays.asList(
  new Person("John", "Smith"),
  new Person("Anna", "Martinez"),
  new Person("Paul", "Watson ")
);

String joinedFirstNames = list.stream()
  .map(Person::getFirstName)
  .collect(Collectors.joining(", ")); // "John, Anna, Paul"

这个 StringJoiner 类也可能有用。

rn0zuynd

rn0zuynd13#

使用java.util.stringjoiner的java 8解决方案

Java8有一个 StringJoiner 班级。但您仍然需要编写一些样板,因为它是java。

StringJoiner sj = new StringJoiner(" and ", "" , "");
String[] names = {"Bill", "Bob", "Steve"};
for (String name : names) {
   sj.add(name);
}
System.out.println(sj);
n6lpvg4x

n6lpvg4x14#

实现这一目标的传统方法是定义一个新的功能:

public static String join(String joinStr, String... strings) {
    if (strings == null || strings.length == 0) {
        return "";
    } else if (strings.length == 1) {
        return strings[0];
    } else {
        StringBuilder sb = new StringBuilder(strings.length * 1 + strings[0].length());
        sb.append(strings[0]);
        for (int i = 1; i < strings.length; i++) {
            sb.append(joinStr).append(strings[i]);
        }
        return sb.toString();
    }
}

样品:

String[] array = new String[] { "7, 7, 7", "Bill", "Bob", "Steve",
        "[Bill]", "1,2,3", "Apple ][","~,~" };

String joined;
joined = join(" and ","7, 7, 7", "Bill", "Bob", "Steve", "[Bill]", "1,2,3", "Apple ][","~,~");
joined = join(" and ", array); // same result

System.out.println(joined);

输出:
7,7,7和比尔,鲍勃,史蒂夫,还有1,2,3和苹果~

mlnl4t2r

mlnl4t2r15#

如果您想在不使用任何外部库的情况下使用jdk,那么您所拥有的代码是正确的方法。在jdk中没有简单的“一行程序”。
如果您可以使用外部libs,我建议您查看apache commons库中的org.apache.commons.lang.stringutils类。
用法示例:

List<String> list = Arrays.asList("Bill", "Bob", "Steve");
String joinedResult = StringUtils.join(list, " and ");

相关问题