2017-06-25 14 views
0

yamlファイルの読み取り中にLinkedHashMapを使用して順序を保持しています。JavaのLinkedHashMapのリストを反復処理します。

reader = new YamlReader(new FileReader(file)); 
read_contents = (Map<String, List<LinkedHashMap<String, Object>>>) reader.read(); 
List<LinkedHashMap<String, Object>> all_items = read_contents.get("XYZ"); 
for (LinkedHashMap<String, Object> item : all_items) { 
    for (Map.Entry<String, Object> entry : item.entrySet()) { 
     <some code> 
    } 
} 

エラー下回っ行き方:

Exception in thread "main" java.lang.ClassCastException: java.util.HashMap cannot be cast to java.util.LinkedHashMap

+1

キャスティング= – shmosel

+2

使用してあなたはそれをキャストして、 'LinkedHashMap'に' HashMap'を変更することはできません。彼らは異なったものです。 – khelwood

+1

あなたは間違った角度から近づいています。解析が完了したら、注文を回復するには遅すぎます。あなたは、*パーサーがその順序を保持する方法を研究する必要があります。 – shmosel

答えて

0

編集:コメントへのおかげで、私は今の順序は、(私は私の元の答えにこの点を見逃していた)が重要であることを認識しています。実際の問題はYamlReaderが内部でLinkedHashMapを使用していないため、リストの各要素にアクセスしたときにその順序が既に失われていることです。

リーダーのコードにアクセスできる場合は、HashMapの代わりにLinkedHashMapを内部的に使用するように修正することができます。そうでない場合は、Jackson extension for YAMLを使用することもできます。


今、私のオリジナルの答え...

エラーがそれをすべて言う:HashMapLinkedHashMapにキャストすることはできません。したがって、LinkedHashMapの代わりにHashMapにキャストすると問題ありません。しかし、クライアントコードに特定の実装を使用することは、通常、悪い習慣とみなされます。これは、YamlReaderによって作成されたマップの具体的なクラスを知らないためです。代わりに、あなただけのインターフェイスMapを使用する必要があります。

reader = new YamlReader(new FileReader(file)); 
read_contents = (Map<String, List<Map<String, Object>>>) reader.read(); 
List<Map<String, Object>> all_items = read_contents.get("XYZ"); 

for (Map<String, Object> item : all_items) { 
    for (Map.Entry<String, Object> entry : item.entrySet()) { 
     // <some code> 
    } 
} 

基本的なプログラミングの原則である具体的なクラスへのインタフェースとしないように、あなたプログラムこれは、より安全です。

のJava 8を使用すると、よりコンパクトなコードと同じ達成することができます!

all_items.forEach(item -> item.forEach((k, v) -> /* <some code> */)); 
+1

これはすべて当てはまりますが、注文を保存するという問題は解決しません。 – Jason

+0

@ Jasonリーダが 'LinkedHashMap'を内部的に使用していない場合、その注文はすでに失われています。読者がキャストだけで 'HashMap'の代わりに' LinkedHashMap'を使っているかのようにすることはできません。 –

+0

あなたはポイントを逃したと思います:* yamlファイルを読んでいる間、LinkedHashMapを使って注文を保存しています。* – shmosel