0

すべての要素に使用されるいくつかの属性を持つ HashSet を使用してから、この Hashset を各要素に対応する HashMap に追加しています。さらに、特定の要素 (例 THEAD ) に追加される属性はほとんどありません。

ただし、後で追加された属性alignは、Table と THEAD の両方に存在します。以下のコードに何か問題がありますか。

private static HashMap<String, Set<String>> ELEMENT_ATTRIBUTE_MAP = 
        new HashMap<String, Set<String>>();

HashSet<String> tableSet = 
            new HashSet<String>(Arrays.asList(new String[]
            {HTMLAttributeName.style.toString(),
             HTMLAttributeName.color.toString(),
             HTMLAttributeName.dir.toString(),
             HTMLAttributeName.bgColor.toString()}));

ELEMENT_ATTRIBUTE_MAP.put(HTMLElementName.TABLE, new HashSet<String>(tableSet));

// Add align only for Head 
tableSet.add(HTMLAttributeName.align.toString());

ELEMENT_ATTRIBUTE_MAP.put(HTMLElementName.THEAD, tableSet);
4

1 に答える 1

1

コードは期待どおりに動作するはずです。動作を示す次の (簡略化された) 例を考えてみましょう。

public static void main(String[] args) {
    String[] array = new String[] {"a", "b", "c"};
    HashSet<String> strings = new HashSet(Arrays.asList(array));

    Map<String, Set<String>> map = new HashMap();
    Map<String, Set<String>> newMap = new HashMap();
    Map<String, Set<String>> cloneMap = new HashMap();

    map.put("key", strings);
    newMap.put("key", new HashSet(strings));
    cloneMap.put("key", (Set<String>) strings.clone());

    strings.add("E");

    System.out.println(map); //{key=[E, b, c, a]}
    System.out.println(newMap); //{key=[b, c, a]}
    System.out.println(cloneMap); //{key=[b, c, a]}

}

map.put("key", strings)Java 変数は、オブジェクト自体ではなく、オブジェクトへの参照であることに注意してくださいHashSet。したがって、後で更新するとHashSetHashMapも更新されます。

于 2012-10-10T13:57:59.417 に答える