2011-02-09 9 views
4

に列挙値を挿入します。本当にできますか?私はいろいろ試してみましたが失敗しました。は私がHashMapのに列挙値を挿入する必要のあるプログラムをやっているのHashMap

誰でもお手伝いできますか?プログラムを通して、私は(名前のキーとして機能)に対応する、私はThreapoolExcecutorオブジェクトを持っている4つのスレッドプールを含むHashMapを実装する必要があります。与えられた以下

が私のコードです:

public class MyThreadpoolExcecutorPgm { 
    enum ThreadpoolName 
    { 
     DR, 
     PQ, 
     EVENT, 
     MISCELLENEOUS; 
    } 
    private static String threadName; 
    private static HashMap<String, ThreadPoolExecutor> threadpoolExecutorHash; 

    public MyThreadpoolExcecutorPgm(String p_threadName) { 
     threadName = p_threadName; 

    } 

    public static void fillthreadpoolExecutorHash() { 
     int poolsize = 3; 
     int maxpoolsize = 3; 
     long keepAliveTime = 10; 
     ThreadPoolExecutor tp = null; 
     threadpoolExecutorHash = new HashMap<String, ThreadPoolExecutor>(); 

     ThreadpoolName poolName ; 
     tp = new ThreadPoolExecutor(poolsize, maxpoolsize, keepAliveTime, 
       TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5)); 

     threadpoolExecutorHash.put(poolName,tp); //Here i am failing to implement currect put() 


    } 

答えて

7

代わりに、ここでHashMapEnumMapを使用して検討する必要があります。 EnumMapは、ここでやっている正確に何であるように思われ、より速く、より多くのスペース効率列挙値を使用してHashMap超えています。

+0

@ aioobe- EnumMapを使用する主な理由は、列挙型から他の型へのマップとして使用するように特別に設計されていることです。私はおそらく、それがおそらく手近な仕事のためにはるかに優れたツールであるという事実の主な理由として、効率を挙げるべきではありません。これを指摘してくれてありがとう。あなたは完全に正しい。 – templatetypedef

+0

私は自分のコメントを削除しました。あなたのコメントであなたが言ったことも気づいたからです。 – aioobe

3

確かに、それは地図のキーとして列挙型を持つことが可能です。

ThreadPoolExecutor sのString秒からthreadpoolExecutorHashマップので、あなたがエラーを取得し、あなたがキーとしてStringpoolName)を挿入しようとしているので、それが失敗しました。 @templatetypedefで述べたようにジャスト

threadpoolExecutorHash = new HashMap<ThreadpoolName, ThreadPoolExecutor>(); 

threadpoolExecutorHash = new HashMap<String, ThreadPoolExecutor>(); 

から変更

、キーとして列挙型を使用するための仕立てにも特殊なMap実装、EnumMapがあります。

+0

そして、あなたはあなたのマップ内のキーとして列挙型を置けば、EnumMap(http://download.oracle.com/javase/6/docs/api/を使用することをお勧めしますjava/util/EnumMap.html)であり、効率的です。 – padis

+0

おかげで、答えを更新しました。 – aioobe

0

あなたが代わりに列挙型クラスを使用する必要があり、あなたのHashMapのキーとして文字列を使用しています。あなたのコードは次のようになります。

public class MyThreadpoolExcecutorPgm { 
enum ThreadpoolName 
{ 
    DR, 
    PQ, 
    EVENT, 
    MISCELLENEOUS; 
} 
private static String threadName; 
private static HashMap<ThreadpoolName, ThreadPoolExecutor> threadpoolExecutorHash; 

public MyThreadpoolExcecutorPgm(String p_threadName) { 
    threadName = p_threadName; 

} 

public static void fillthreadpoolExecutorHash() { 
    int poolsize = 3; 
    int maxpoolsize = 3; 
    long keepAliveTime = 10; 
    ThreadPoolExecutor tp = null; 
    threadpoolExecutorHash = new HashMap<ThreadpoolName, ThreadPoolExecutor>(); 

    ThreadpoolName poolName ; 
    tp = new ThreadPoolExecutor(poolsize, maxpoolsize, keepAliveTime, 
      TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5)); 

    threadpoolExecutorHash.put(poolName,tp); //Here i am failing to implement currect put() 
} 
関連する問題