-4

Javaに2つの配列リストAとBがあります。Arraylist A には重複がありますが、Arraylist B には arraylist A のすべての要素ではなく一意の要素があります。arraylist B に存在する arraylist A の要素の頻度をカウントしたい

小さな例

A = {Red, Black, Red, Black, Green, Green, Brown, Black, Brown, Green}
B=  {Red, Brown, Green}

結果は、赤 = 2、茶 = 2、緑 = 3 になります。

4

3 に答える 3

0

Google guava の「MultiSet」インターフェースを見てください。

MultiSet<String> multiSet = HashMultiSet.create(listA);
for (String s : listB) {
   multiSet.count(s);
}

List ではなく multiSet に要素を直接格納することで、常にパフォーマンスを向上させることができます。ただし、MultiSet は List ではなく Collection インターフェイスを実装しているため、それは他に何をしたいかによって異なります。

于 2012-07-11T03:01:58.170 に答える
0

アップデート:

    List<String> listA = Arrays.asList("Red", "Black", "Red", "Black", "Green", "Green", "Brown", "Black", "Brown", "Green");
    List<String> listB = Arrays.asList("Red", "Brown", "Green");

    for (String color : listB) {
        System.out.println(string + " " + Collections.frequency(listA, color));
    }
于 2012-07-10T18:10:05.083 に答える
0

リスト A を Map<K, V> に置き換えることはできませんか?ここで、K は A にあるオブジェクトのクラス型 (文字列など) で、V は Integer や Long などの数値です。次に、同じ古い値を単純に A に追加するのではなく (最初にリストを作成するとき)、たとえば次のようにします。

Map<String, Integer> countMap = new HashMap<String, Integer>();
Integer currentCount = countMap.get("Red");
countMap.put("Red", (currentCount == null ? 1 : currentCount.intValue() + 1));

次に、リスト B で見つかった各オブジェクトの数を取得するには、マップを実行して、B の各オブジェクトを 1 つずつチェックします。

List<String> listB = new List<String>();
listB.add("Red");
listB.add("Brown");
listB.add("Green");
for(String s : listB) {
    Integer quantityFoundInA = countMap.get(s);
    System.out.println("String <"+s"> found in list (map) 'A' "+(quantityFoundInA == null ? 0 : quantityFoundInA.intValue())+" times");
}

この構造は、単純に同じオブジェクトの複数のコピーを List に格納するよりも効率的であると推測しています (ただし、A に格納しているオブジェクトが同じ名前を共有している場合はまったく同じである必要があります)。

于 2012-07-10T19:57:36.943 に答える