在java中正确地将字符串数组转换为字符串并返回

在java中正确地将字符串数组转换为字符串并返回,java,arrays,string,Java,Arrays,String,我有以下代码: String[] stringArray = new String[] { "One,", "Two", "Three" }; System.out.println(Arrays.toString(stringArray)); 将生成以下字符串: [One,, Two, Three] 现在,由于两个连续的逗号 如何正确进行此转换 更新 这只是一个特殊情况,我不局限于使用这种方法。我需要实现一种方法,其中从字符串[]到字符串以及从字符串[]到字符串[]的转换将是幂等运算。将其转

我有以下代码:

String[] stringArray = new String[] { "One,", "Two", "Three" };
System.out.println(Arrays.toString(stringArray));
将生成以下字符串:

[One,, Two, Three]
现在,由于两个连续的逗号

如何正确进行此转换

更新


这只是一个特殊情况,我不局限于使用这种方法。我需要实现一种方法,其中从字符串[]到字符串以及从字符串[]到字符串[]的转换将是幂等运算。

将其转换为类似JSON的格式。使用Jackson会是这样的:

 ObjectMapper objectMapper = new ObjectMapper();

 String out = objectMapper.writeValueAsString(Arrays.asList(array));
String[] stringArray = new String[] { "One,", "Two", "Three" };
    StringBuilder string = new StringBuilder();
    string.append("[");
    for (int i = 0; i < stringArray.length; i++) {
        string.append(stringArray[i] + (i == (stringArray.length - 1) ? "" : "; "));
    }
    string.append("]");
    System.out.println(string);
    System.out.println(string.toString().substring(1, string.length() - 1).split("; "));
返回:

 List<String> strings = (List<String>) objectMapper.readValue(out, List.class);

 String[] array2 = strings.toArray();
您声明Arrays.toString绝对不是必需的

我建议您将阵列添加到Base64:

public String serializeArray(final String[] data) {
    try (final ByteArrayOutputStream boas = new ByteArrayOutputStream();
         final ObjectOutputStream oos = new ObjectOutputStream(boas)) {
        oos.writeObject(data);
        return Base64.getEncoder().encodeToString(boas.toByteArray());
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
然后将Base64反序列化为数组:

public String[] deserializeArray(final String data) {
    try (final ByteArrayInputStream bias = new ByteArrayInputStream(Base64.getDecoder().decode(data));
         final ObjectInputStream ois = new ObjectInputStream(bias)) {
        return (String[]) ois.readObject();
    } catch (IOException | ClassNotFoundException e) {
        throw new RuntimeException(e);
    }
}
这需要Java8

例如:

public static void main(String args[]) throws Exception {
    String[] stringArray = new String[]{"One,", "Two", "Three"};
    String serialized = serializeArray(stringArray);
    String[] deserialized = deserializeArray(serialized);
    System.out.println(Arrays.toString(stringArray));
    System.out.println(serialized);
    System.out.println(Arrays.toString(deserialized));
}
输出

[One,, Two, Three]
rO0ABXVyABNbTGphdmEubGFuZy5TdHJpbmc7rdJW5+kde0cCAAB4cAAAAAN0AARPbmUsdAADVHdvdAAFVGhyZWU=
[One,, Two, Three]
注意,这适用于实现可序列化的任何对象,而不仅仅是字符串[]

作为一种简单的替代方法,您可以在加入阵列之前将其替换为\,然后在拆分阵列之后将其替换为\。这依赖于CSV使用的标准转义分隔符模式。但是,如果用户在输入的某处输入\,那么它将失败,因此不那么健壮:YMMV

public String serializeArray(final String[] data) {
    return Arrays.stream(data)
            .map(s -> s.replace(",", "\\,"))
            .collect(joining(","));
}

public String[] deserializeArray(final String data) {
    return Pattern.compile("(?<!\\\\),").splitAsStream(data)
            .map(s -> s.replace("\\,", ","))
            .toArray(String[]::new);
}

我真的不知道你想做什么,但是数组分隔符,在你的字符串中,所以避免这种情况的最简单的方法是避免使用默认数组分隔符构建字符串!像这样:

 ObjectMapper objectMapper = new ObjectMapper();

 String out = objectMapper.writeValueAsString(Arrays.asList(array));
String[] stringArray = new String[] { "One,", "Two", "Three" };
    StringBuilder string = new StringBuilder();
    string.append("[");
    for (int i = 0; i < stringArray.length; i++) {
        string.append(stringArray[i] + (i == (stringArray.length - 1) ? "" : "; "));
    }
    string.append("]");
    System.out.println(string);
    System.out.println(string.toString().substring(1, string.length() - 1).split("; "));

当然,您可以使用默认的数组分隔符做更多的工作,但这取决于您想做什么,我只选择最简单的方法。

您不能。除非你有规则。规则是什么?从字符串[]到字符串以及从字符串[]到字符串[]的转换必须是幂等运算为什么需要多余的强制转换?那么您需要一种能够区分分隔符和文本的格式,例如。@shmosel我使用基于用户输入的动态类型。我将删除问题中的多余演员阵容,对吗now@DineshRaviJava1.6?!?!这与9分钟前发布的答案有什么关系?与15年前发布的相比,当这可能是相关的时候。我使用Java 8,所以我完全同意这种方法。您当然需要包括Jackson库。@alexanoid请参阅我的答案,了解一种不需要外部库的方法-但在缺点方面,序列化输出不是人类可读的。很好,它不需要任何其他库。谢谢非常感谢!我将在几分钟后测试它。再次感谢您的回答。字符串有任何问题。加入;,字符串数组?另外,如果我的输入是{One;,Two,Three},该怎么办?String.join没有问题,如果字符串可以包含任何字符,我的解决方案将无法工作。此外,您还可以使用一个字符包装每个字符串,您可以确定,它不会出现在字符串中,例如:{'1','2','3'}。此外,不确定为什么要在循环中使用StringBuilder来避免string.concat,然后在循环中立即使用string.concat-您应该在StringBuilder中使用append。。。