• ベストアンサー

HashMapのValue値更新管理について

HashMapを使用し以下の動作を実行したいです。 ■動作 ・HashMapを使用し、KeyとValueを管理(約700件) ・1秒間隔で更新されるこのHashMapを10秒間隔でDBに書き込み  ※HashMap内の更新されたValueのみDBに書き込み ■質問 上記※部分について、HashMap内Valueの更新有無をFlag(boolean)で管理できないか? 何か良い方法はありませんでしょうか? 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

HashMap自体を拡張してしまうのもひとつの手段でしょう。 例では#putメソッドにトリガを実装していますが 必要であれば各メソッドに追加すればよいと思います。 もちろん外部で管理するようにしてもよいでしょう。 最後に#clearUpdateKeySetされた時点から#putによって 変更されたキーのみを返す#getUpdateKeySetを持ちます。 また任意のキーを渡して変更があったかどうかを表す#isUpdateを持ちます。 import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * CustomHashMap */ public class CustomHashMap<K, V> extends HashMap<K, V> { /** UpdateKeySet */ private Set<K> updateKeySet_ = new HashSet<K>(); /* (非 Javadoc) * @see java.util.HashMap#put(java.lang.Object, java.lang.Object) */ @Override public V put(K key, V value) { if (super.containsKey(key)) { if (!super.get(key).equals(value)) { updateKeySet_.add(key); } } else { updateKeySet_.add(key); } return super.put(key, value); } /** * Getter for updateKeySet * @return updateKeySet */ public Set<K> getUpdateKeySet() { return updateKeySet_; } /** * Clear UpdateKeySet */ public void clearUpdateKeySet() { updateKeySet_.clear(); } /** * isUpdate * @param key * @return */ public boolean isUpdate(K key) { return updateKeySet_.contains(key); } /** * Constructor for CustomHashMap. */ public CustomHashMap() { super(); clearUpdateKeySet(); } /** * Constructor for CustomHashMap. */ public CustomHashMap(int initialCapacity, float loadFactor) { super(initialCapacity, loadFactor); clearUpdateKeySet(); } /** * Constructor for CustomHashMap. */ public CustomHashMap(int initialCapacity) { super(initialCapacity); clearUpdateKeySet(); } /** * Constructor for CustomHashMap. */ public CustomHashMap(Map<? extends K, ? extends V> m) { super(m); clearUpdateKeySet(); } }

その他の回答 (1)

回答No.2

※HashMap内の更新されたValueのみDBに書き込み と言う事でしたら、それだけを別途管理するのはどうでしょうか? import java.util.HashMap; import java.util.Map; /** * * HashMapを拡張したクラス */ public class Hoge<K, V> extends HashMap<K, V> { private Map<K, V> queue1 = new HashMap<K, V>(); private Map<K, V> queue2 = new HashMap<K, V>(); private boolean flg = true; private Map<K, V> getData ; private Map<K, V> retData; /** * 差分管理開始 */ public void start() { flg = true; getData = queue1; } /** * 管理を行うHashを変更する */ public Map<K, V> getQueue(){ //参照先の受け取り retData = getData; //切替 if (flg) { queue2.clear(); getData = queue2; } else { queue1.clear(); getData = queue1; } //フラグの変更 flg = !flg; return retData; } /** * 変更があったかフラグ * @return the dirty */ public boolean isDirty() { return getData.size() > 0; } @Override public V put(K key, V value) { //開始するまでは、無視する if (getData != null) { if ((super.get(key) == null) || (super.get(key).equals(value) == false)) { //差分を管理 getData.put(key, value); } } return super.put(key, value); } } 実装例 Hoge<String, String> hoge = new Hoge<String, String>(); Map newData; //マスターデータ投入 hoge.put("a", "bbb"); hoge.put("b", "bbb"); hoge.put("c", "bbb"); //管理開始 hoge.start(); hoge.put("a", "bba"); hoge.put("b", "bbb"); //更新データを取得する。 newData = hoge.getQueue(); //データは、作業中も投入される hoge.put("d", "bbe"); hoge.put("e", "aaa"); //作業する System.out.println(newData); hoge.put("a", "bbc"); hoge.put("c", "bbb"); newData = hoge.getQueue(); System.out.println(newData); System.out.println(hoge); getQueueで更新データが取得出来ます。 更新情報を2つのMapで管理すれば、作業中も新しいデータがMap内にキューされます。 ただ、秒単位に正確なデータが必要ならば、全データをDBに投げてPL/SQLで、 更新チェックをかけたほうがいいと思います。

関連するQ&A