Problem: Find the number that has the highest frequency in a list of integers.
Input: 1,6,2,1,6,1
Output: 1 //because 1 occurs 3 times in the list
Option 1: Use Hashmap to iterate list
List<Integer> nums = new List<Integer>{1,6,2,1,6,1};
Map<Integer, Integer> numMap = new HashMap<>();
for (Integer num : nums){
if (numMap.containsKey(num)){
Integer numFreq = numMap.get(num);
numMap.put(num, numFreq+1);
} else {
numMap.put(num, 1);
}
}
Integer biggestFreq = 0;
Integer biggestVal = 0;
for (Integer num : numMap.keySet()){
if (numMap.get(num) > biggestFreq){
biggestFreq = numMap.get(num);
biggestVal = num;
}
}
System.debug(biggestVal);
Option 2: Use wrapper class with compare to sort wrapper
List<Integer> nums = new List<Integer>{1,6,2,1,6,1};
Map<Integer, NumFrequencyWrapper> numMap = new HashMap<>();
for (Integer num : nums){
if (numMap.containsKey(num)){
NumFrequencyWrapper numFreqWrapper = numMap.get(num);
numFreqWrapper.setFrequency(numFreqWrapper.getFrequency()+1);
numMap.put(num, numFreqWrapper);
} else {
NumFrequencyWrapper numFrequencyWrapper = new NumFrequencyWrapper();
numFrequencyWrapper.setNum(num);
numFrequencyWrapper.setFrequency(1);
numMap.put(num, numFrequencyWrapper);
}
}
List<NumFrequencyWrapper> frequencyWrapperList = new List(numMap.values());
Collections.sort(frequencyWrapperList, new Untitled.NumFrequencyWrapperCompare());
System.debug(frequencyWrapperList.get(0).getNum());
public class NumFrequencyWrapper {
private Integer num;
private Integer frequency;
public void setNum(Integer num){
this.num = num;
}
public Integer getNum(){
return num;
}
public void setFrequency(Integer frequency){
this.frequency = frequency;
}
public Integer getFrequency(){
return this.frequency;
}
}
public class NumFrequencyWrapperCompare implements Comparator<NumFrequencyWrapper>{
public int compare(NumFrequencyWrapper a, NumFrequencyWrapper b) {
return b.getFrequency() - a.getFrequency();
}
}
Option 3: Using buckets to group index of frequencies together
List<Integer> nums = new List<Integer>{1,6,2,1,6,1};
Integer returnNums = 2;
Map<Integer, Integer> numMap = new Map<Integer, Integer>();
for (Integer num : nums){
if (numMap.containsKey(num)){
Integer numFreq = numMap.get(num);
numMap.put(num, numFreq+1);
} else {
numMap.put(num, 1);
}
}
Map<Integer, List<Integer>> mapOfBucketWithValues = new Map<Integer, List<Integer>>();
for (Integer num : numMap.keySet()){
Integer numFrequency = numMap.get(num);
if (mapOfBucketWithValues.containsKey(numFrequency)){
List<Integer> existingIndexNum = mapOfBucketWithValues.get(numFrequency);
existingIndexNum.add(num);
mapOfBucketWithValues.put(numFrequency, existingIndexNum);
} else {
List<Integer> numList = new ArrayList<>();
numList.add(num);
mapOfBucketWithValues.put(numFrequency, numList);
}
}
for (Integer k=nums.size(), returnedNums=0; 1<=k; k--){
if (mapOfBucketWithValues.containsKey(k)){
for (Integer numBucket : mapOfBucketWithValues.get(k)){
if (returnedNums < returnNums){
System.debug(numBucket);
returnedNums++;
}
}
}
}