2

チャートを生成するために使用するコードがあります。

HashMap<String, List<Ticket>> openedTicketsPerTeam = getOpenedTicketsPerTeam();

すべての Map 要素のリストの長さをカウントするには、ジェネリック メソッドのシグネチャをどのように記述すればよいですか? 私の考えは:

Map<String, Integer> getNumOfValuesPerKey(HashMap<String, List<? extends Object>> map) {...}

しかし、呼び出し後に変換エラーがあります:

HashMap<String, Integer> numOfTicketsPerTeam = getNumOfValuesPerKey(openedTicketsPerTeam );
4

3 に答える 3

1

このようなもの (任意のキーKVs のリストに使用できます):

public static <K, V> Map<K, Integer> getNumOfValuesPerKey(Map<K, List<V>> map) {

    Map<K, Integer> count = new HashMap<K, Integer>();

    for (Entry<K, List<V>> entry : map.entrySet()) 
        count.put(entry.getKey(), entry.getValue().size());

    return count;
}

例:

public static void main(String[] args) {

    HashMap<String, List<Integer>> map = new HashMap<String, List<Integer>>();

    map.put("Hello", Arrays.asList(1,2,3));
    map.put("World", Arrays.asList(4,5));

    System.out.println(getNumOfValuesPerKey(map));
}

出力:

{Hello=3, World=2}
于 2012-08-07T06:36:07.690 に答える
1

これを試して:

Map<String, Integer> numOfTicketsPerTeam = getNumOfValuesPerKey(openedTicketsPerTeam );

あなたのメソッドは (正しく) を返しますがMap<String, Integer>、それを a に割り当てていますHashMap<String, Integer>- 複数のタイプの Map があり、コンパイラは実装が HsshMap を返すことを知る方法がありません。

メソッドの署名を次のように単純化できることに注意してください。

Map<String, Integer> getNumOfValuesPerKey(Map<String, List<?>> map) {...}

変更は、パラメーターを a Map(not a HashMap) およびList<?>(not List<? extends Object>、同じことですが、より粗末です) にすることです。

于 2012-08-07T06:38:10.013 に答える
0

実際に値の型をパラメータ化する必要はありません。あなたが抱えていた問題Map<K, List<?>>は、ワイルドカードではない一般的なパラメーターが正確に一致しなければならないということです。したがって、 の 2 番目の型パラメーターではMapList<?>は一致しませんList<Ticket>。正しいことは、ワイルドカードも作成することです(たとえばArrayList、パラメーターとして実装クラスを操作できるという追加の利点があります)。

public static <K> Map<K, Integer> getNumOfValuesPerKey(Map<K, ? extends List<?>> map) {

    Map<K, Integer> count = new HashMap<K, Integer>();

    for (Map.Entry<K, ? extends List<?>> entry : map.entrySet()) 
        count.put(entry.getKey(), entry.getValue().size());

    return count;
}
于 2012-08-07T19:40:22.487 に答える