私はこのような配列を持っています:
int[] array = { 2, 4, 6, 8, -3, 8, 2, 7, 2, 4 };
どの数字が最も多く表示されているか (この場合はもちろん 2) を知りたいのですが、どうすればそれを行うことができますか?
以下のコードはJava 8でうまくいくと思います。
int[] array = { 2, 4, 6, 8, -3, 8, 2, 7, 2, 4 };
Arrays.stream(array).collect(Collectors.groupingBy(s -> s))
.forEach((k, v) -> System.out.println(k + ": " + v.size()));
版画:
2: 3
4: 2
8: 2
6: 1
7: 1
-3: 1
int をカウントにマッピングするマップを作成できます。Java では、HashMap<Integer, Integer>
. リストを調べて、int が既にマップにあるかどうかを確認します。そうであれば、そのカウントに 1 を追加し、そうでなければ 1 に初期化します。その後、マップに戻って、カウントが最大の番号を見つけます。
度数分布を作成し、配列を反復処理する必要があります。整数を使用しているため、キーとして直接使用できるため、簡単になります。
HashTable frequencyDistribution = new HashTable();
for(int i=0; i<array.length; i++) {
int key = array[i];
if( !frequencyDistribution.containsKey( key ) ) frequencyDistribution.add( key, 0 );
frequencyDistribution[ key ]++;
}
int modeKey;
int modeCnt = int.MIN;
foreach(int key in frequencyDistribution.keys) {
int cnt = frequencyDistribution[key];
if( cnt > modeCnt ) modeKey = key;
}
print("Most frequent is: {0} as it appears {1} times.", modeKey, modeCnt);
バケット ソートのバケット フィル ステップを使用してから、すべてのバケットを線形にスキャンして、最も頻繁に表示される数を取得できます (配列内の最大数を取得する方法を知っていますよね?)。基になるデータ構造は配列である必要はありません (これが最も高速です)。キー -> 値メカニズムを持つものなら何でも使用できます。これは、BIG 範囲の場合、メモリの制約により配列を使用できない可能性があるためです。実行時間。