2017-04-02 16 views
0

私は、次のコードを持っている:正しく文字列に文字列配列を変換し、バックJavaで

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

次の文字列を生成します。に戻って、この文字列を変換することは不可能である今

[One,, Two, Three] 

を同じString[](3つの要素が2つの連続するカンマのため),,

この変換を正しく行うにはどうすればいいですか?

Arrays.toString(stringArray) 

を更新し

はただ特定のケースで、私はこのアプローチを使用することに限定されませんよ。私はString []からStringへの変換とStringからString []への変換が冪等の操作になるアプローチを実装する必要があります。

+4

できません。あなたが**ルール**を持っていない限り。ルールは何ですか? –

+1

String []からStringへの変換とStringからString []への変換は、等価操作でなければなりません – alexanoid

+0

余分なキャストはなぜですか? – shmosel

答えて

4

あなたがいることを述べる1

私はあなたを示唆serialize "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); 
    } 
} 

をこれは、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] 

注、これはのために働きます任意Objectそのimplements 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)); 

バック:

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' '' 'three' '} ''のようになります。 – StetHD

+0

また、なぜ 'StringBuilder'を使ってループ内で' String.concat'を避けて、すぐに 'String.concat'をループで使用するのかわかりません - ' StringBuilder'で 'append'を使うべきです... –

関連する問題