Given a array of input, sort it based on the number of occurrence count
Input : [8,0,1,5,5,3,3,3]
Output : [0,1,8,5,5,3,3,3]
Code:
package wordpress;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Collectors;
public class SortNumbers {
public static Integer[] sortBasedOnOccurrences(Integer[] input) {
Map<Integer, Integer> occurrenceCount = new LinkedHashMap<>();
for (Integer key : input) {
if (occurrenceCount.containsKey(key)) {
int count = occurrenceCount.get(key);
occurrenceCount.put(key, ++count);
} else {
occurrenceCount.put(key, 1);
}
}
Map<Integer, Integer> sorted = occurrenceCount
.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
Integer[] result = new Integer[input.length];
int i = 0;
for (Map.Entry<Integer, Integer> entry : sorted.entrySet()) {
int counter = entry.getValue();
while (counter != 0) {
result[i++] = entry.getKey();
counter--;
}
}
return result;
}
public static void main(String[] args) {
System.out.println(Arrays.toString(sortBasedOnOccurrences(new Integer[]{8, 0, 1, 5, 5, 3, 3, 3}))); // 0 1 8 5 5 3 3 3
System.out.println(Arrays.toString(sortBasedOnOccurrences(new Integer[]{3, 3, 1, 2, 4}))); // 1 2 4 3 3
System.out.println(Arrays.toString(sortBasedOnOccurrences(new Integer[]{0,0,1,1,2,2}))); // 0 0 1 1 2 2
System.out.println(Arrays.toString(sortBasedOnOccurrences(new Integer[]{0}))); // 0
}
}
