2013-07-26 10 views
8

私は以下のようにマップを構築できることを知っています。プロパティファイルにマップを保存する

private static final ImmutableMap<String,String> WordMap = 
ImmutableMap.<String, String>builder() 
.put("blah", "blahblah").put("blabla", "blahblahblah").build() 

私のマップの値を設定ファイルに保存したいと思います。 私はすでに、私は私のマップに似た何かをしたいと思います

values=value1,value2,value3を実行して設定ファイルの異なるHashSetのための値を格納し、その後
new HashSet<String>(Arrays.asList(prop.getProperty(values).split(",")))

よ。 ヒント? 私は java.util.Properties

+0

'properties.putAll(WordMap)'を介して 'Properties'にマップの各キー/値のペアを入れてマップを追加したくないと思います。代わりにマップ全体をプロパティに単一の値? – zapl

答えて

17

あなたはJSONを使用したくない示してきたので、あなたのようにマップを保存することができ

:マップを読み書き簡素化する

map=key1=value1,key2=value2,key3=value3 

使用Guava's Splitter and Joiner:このような単一のプロパティ

String formatMap(Map<String, String> map) { 
    return Joiner.on(",").withKeyValueSeparator("=").join(map); 
} 

Map<String, String> parseMap(String formattedMap) { 
    return Splitter.on(",").withKeyValueSeparator("=").split(formattedMap); 
} 

これは、キーと値に "、"または "="文字が含まれていない限り動作します。

+0

ありがとう!だから私はちょうどプロパティを取得することができますparseMapを呼び出すと、それは私のマップ – Lemonio

+0

逆の順序で2番目のステートメントを行う効率的な方法がありますか?値 - >キーマップが必要な場合は、プロパティファイルに新しいものを再作成するか、2番目の設定を保存したくない場合は – Lemonio

+0

@Lemonio GuavaのBiMap:http:// docsをご覧ください。 guava-libraries.googlecode。com/git/javadoc/com/google/common/collect/BiMap.html – dnault

1

を使用しています。java.util.Propertiesは、プロパティファイルに記載されているキー値のペアを格納するためにハッシュテーブルを内部的に使用しています。あなたはあなたの目的のためにそれをフルに活用することができます。

+0

@SotiriosDelimanolisはい修正されました。ありがとう! –

+0

内部的に使用しないように変更することもできます。私はそれがインスタンス変数を持っていることを理解しています。それは実際に 'ハッシュテーブルを拡張します。それは他人を混乱させるかもしれない。 –

+0

@ Zim-ZamO'Pootertoot public クラスプロパティはHashtable を延長します –

2

マップの内容を文字列として書式設定します。 JSONなどの標準形式を使用します。マップを解析するに

JSONObject json = new JSONObject(); 
json.putAll(WordMap); 
String serializedMap = json.toString(); 
prop.setProperty("wordMap", serializedMap); 

json-smartライブラリーでは、これは次のようになり

String serializedMap = prop.getProperty("wordMap"); 
JSONObject json = (JSONObject) JSONValue.parse(serializedMap); 
Map<String, String> wordMap = new HashMap<>(); 

for (Map.Entry<String,Object> entry : json.entrySet()) { 
    wordMap.put(entry.getKey(), (String) entry.getValue()); 
} 
+0

申し訳ありません、ありがとう!そのコードでマップを作成する必要がありますか?プロパティは単なるテキストファイル以上のものですか?人々がテキストファイル内のマップの内容を構成できるという考えがあったため、コードを実行する必要がある場合は、コード内のputステートメントを変更することはできません。 – Lemonio

+1

アイデアこの答えの背後にあるのは、単語マップを単一のプロパティに格納したい場合、単語マップを文字列としてフォーマットする必要があるということでした。 JSONはライブラリのサポートが優れた標準フォーマットですが、エンドユーザーがプロパティファイルを編集する予定であるため、JSONはおそらく最良の選択ではありません。ユーザーにとって最もシンプルなフォーマットを使用して、カスタムコードを書いてフォーマットして解析してください。 key = value1、key2 = value2、key3 = value4は、キーと値に "="や "、"の文字が含まれていない限り正常です。 – dnault

+0

この回答を投稿した後、JacksonはJSON [de]のシリアル化とデータバインディングのための私のライブラリになりました。感謝! – dnault