2017-04-02 74 views
0

我有下面的代碼:正確字符串數組轉換爲字符串並返回在Java中

String[] stringArray = new String[] { "One,", "Two", "Three" }; 
System.out.println(Arrays.toString(stringArray)); 

產生以下字符串:

[One,, Two, Three] 

現在這是不可能的這個字符串轉換回同樣的String[]與3個元素,因爲連續兩個逗號,,

如何正確進行此轉換?

修訂

Arrays.toString(stringArray) 

只是一個特定的情況下,我不會侷限於只使用這種方法。我需要實現從String []到String的轉換以及從String到String []的轉換將是冪等操作的方法。

+4

你不能。除非你有**規則**。什麼是規則? –

+1

從字符串[]轉換爲字符串並從字符串轉換回字符串[]必須是冪等運算 – alexanoid

+0

爲什麼多餘的轉換? – shmosel

回答

4

幽州1

我建議你serialize Array to 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); 
    } 
} 

這需要Java 8.

實施例:

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] 

注意,這適用於任何Objectimplements Serializable,而不僅僅是String[]


舉一個簡單的選擇,你可以通過\,加入陣列之前更換,,然後還,分裂後把它放回\,。這依賴於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); 
} 
+0

好,它不需要任何額外的庫。 – davidxxx

+0

非常感謝!我將在接下來的幾分鐘內對它進行測試。再次感謝這個偉大的答案。 – alexanoid

2

將其轉換爲專門用於此目的的格式,如JSON。用傑克遜會是這樣的:

ObjectMapper objectMapper = new ObjectMapper(); 

String out = objectMapper.writeValueAsString(Arrays.asList(array)); 

回來: 「Arrays.toString是絕對不需要

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

String[] array2 = strings.toArray(); 
+0

ObjectMapper在java 1.6中沒有被識別.. –

+2

@DineshRavi Java 1.6?!?!這與發佈** 9分鐘**之前的答案有什麼關係? (與15年前發佈的相比,這可能是相關的)。 –

+0

我使用Java 8,所以我完全可以使用這種方法 – alexanoid

0

我真的不知道你想做什麼,但陣列分離,是在你的字符串,那麼最簡單的方法來避免這將是避免建設有默認的陣列分隔字符串!像這樣:

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

你當然可以做一些更多的東西就讓它使用默認陣列分離工作,但它取決於你想要做什麼,我只是選擇了最簡單的方法。

+0

String.join(「;」,stringArray)''有什麼問題?另外,如果我的輸入是「{」One;「,」Two「,」Three「}? –

+0

'String.join'沒有錯,如果你的字符串可以包含任何字符,我的解決方案將不起作用。你也可以用一個你確定的字符來包裝每一個字符串,它不會在字符串中,就像'{「'one','',''two',''''''}。 – StetHD

+0

此外,不知道爲什麼你使用'StringBuilder'來避免循環中的'String.concat',然後在循環中及時使用'String.concat' - 你應該使用'append'和'StringBuilder' ... –

相關問題