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++; } } } }