現在のアレイを破棄しても構わないと思っている場合は、これを行うことができます。そして、配列は Integer 型 (null 可能) であるか、そうでない場合はすべての int などの境界が正であるため、 を使用できると想定します-1
。
for(int i = 0; i < values.length; i++){ //for entire array
Integer currVal = values[i]; // select current value
int count = 1; // and set count to 1
if(currVal != null){ // if value not seen
for( int j = i + 1; j < values.length; j++){ // for rest of array
if(values[j] == currVal){ // if same as current Value
values[j] = null; // mark as seen
count++; // and count it
}
}
System.out.print("Number : " + currVal + " Count : " + count + "\n");
//print information
}
// if seen skip.
}
簡単に言えば、配列を 2 つのループで処理します。およそ O(n^2) 時間です。インデックス i に移動します。インデックスがまだ表示されていない (null でない) 場合は、配列の残りの部分を調べて、表示されているものと同じ値を持つインデックスをマークし (null にします)、count 変数をインクリメントします。ループの最後に、値とカウントを出力します。インデックスが表示された場合 (null の場合) スキップして次のインデックスに移動します。両方のループの最後で、すべての値は null のままになります。
Input : Values[] = {1,1,4,4,2,3,3,2,1,3}
Output : Values[] = {1,null,4,null,2,3,null,null,null,null}
Number : 1 Count : 3
Number : 4 Count : 2
Number : 2 Count : 2
Number : 3 Count : 3
編集:コメント者から指摘された出力の間違いを修正しました。