0

それぞれが列挙型である5つの要素を持つ配列リストがあります。リスト内で最も一般的な要素を含む別の配列リストを返すメソッドを作成したいと思います。

例1:

[Activities.WALKING, Activities.WALKING, Activities.WALKING, Activities.JOGGING, Activities.STANDING]

メソッドは次を返します:[Activities.WALKING]

例2:

[Activities.WALKING, Activities.WALKING, Activities.JOGGING, Activities.JOGGING, Activities.STANDING]

メソッドは次を返します:[Activities.WALKING, Activities.JOGGING]

私が試したこと:

私の考えは、すべてのアクティビティのカウントを宣言することでしたが、別のアクティビティを追加する場合は、コードを変更して、そのアクティビティの別のカウントを追加する必要があります。

もう1つのアイデアは、を宣言しHashMap<Activities, Integer>て配列を反復処理し、各アクティビティとその発生をその中に挿入することでした。しかし、どのようにして最も発生率の高いアクティビティを抽出するのでしょうか?

みんな助けてくれませんか?

4

2 に答える 2

2

このようなものを実装する最も一般的な方法は、列挙の各要素にゼロを格納するMap:defineaを使用してカウントすることです。Map<MyEnum,Integer>次に、リストをウォークスルーし、リストで見つかった各要素のカウンターをインクリメントします。同時に、現在のmaxカウントを維持します。最後に、カウンターマップエントリをウォークスルーし、カウントがの値と一致するすべてのエントリのキーを出力リストに追加しますmax

于 2013-03-24T16:32:45.880 に答える
0

統計では、これは「モード」と呼ばれます(特定のケースでは、1つだけでなく、最も頻繁に表示されるすべての値が必要なため、「マルチモード」も使用されます)。バニラJava8ソリューションは次のようになります。

Map<Activities, Long> counts =
Stream.of(WALKING, WALKING, JOGGING, JOGGING, STANDING)
      .collect(Collectors.groupingBy(s -> s, Collectors.counting()));

long max = Collections.max(counts.values());
List<Activities> result = counts
      .entrySet()
      .stream()
      .filter(e -> e.getValue().longValue() == max)
      .map(Entry::getKey)
      .collect(Collectors.toList());

どちらが得られますか:

[WALKING, JOGGING]

jOOλmodeAll()はストリームをサポートするライブラリです。次のプログラム:

System.out.println(
    Seq.of(WALKING, WALKING, JOGGING, JOGGING, STANDING)
       .modeAll()
       .toList()
);

収量:

[WALKING, JOGGING]

(免責事項:私はjOOλの背後にある会社で働いています)

于 2016-03-20T15:32:16.080 に答える