1

のクラスがありHashMap<k,v>ます。これの値の型は、HashMap属性として 2 つの異なるオブジェクトを持つ静的クラスです。つまり、

   public class Example {
      private HashMap<String, StaticClassExample> map;
      private static class StaticClassExample {
           private Object1 o1;
           private Object2 o2;
           //...   
      }
      //...
   }

そして私の質問は、この操作を効率的に行うにはどうすればよいかです:

   public List<Object1> getAllObject1() {}

私はできることを知っています:map.values()そして、値のコレクションを反復して、各 StaticClassExample から Object1 を取得しますが、これは効率的ではありません。私が尋ねることは可能ですか、それとも私の目的のために別のハッシュマップを作成する必要がありますか?

4

1 に答える 1

0

メモリのオーバーヘッドが気にならない場合は、o1 値を含む別のリストを保持できます。

public class HashMapList
{
    private HashMap<String, StaticClassExample> map = new HashMap<String, HashMapList.StaticClassExample>();

    private List<Object> o1List = new LinkedList<Object>();

    public static class StaticClassExample
    {
        private Object o1;
        private Object o2;
    }

    public void addStaticClassExample(String key, StaticClassExample example)
    {
        StaticClassExample oldVal = map.put(key, example);
        if(oldVal != null)
        {
            o1List.remove(oldVal.o1);
        }
        o1List.add(example.o1);
    }

    public StaticClassExample getStaticClassExampleByKey(String key)
    {
        return map.get(key);
    }

    public void removeStaticClassExampleByKey(String key)
    {
        StaticClassExample removed = map.remove(key);
        if(removed != null)
        {
            o1List.remove(removed.o1);
        }
    }

    public List<Object> getAllObject1()
    {
        return Collections.unmodifiableList(o1List);
    }   

}

もちろん、これには HashMap をクラス内にカプセル化し、直接アクセスできないようにする必要があります。これは、クラスを使用する誰かが HashMap を直接変更する可能性があり、List が Map と同期しなくなるためです。getAllObject1内部リストの変更不可能なビューを返すため、クラスの外部から変更できないことに注意してください。

于 2012-01-28T10:06:41.623 に答える