如何查询数组并打印指定位次范围的最频繁整数?
如何根据频率位次范围获取数组中对应频率的整数?
这是个很实用的需求,我来一步步帮你实现这个方法,完全匹配你给出的示例要求。
首先明确核心需求:给定一个int数组,传入一个位次范围(比如[2,4]),需要按频率从高到低的顺序,输出这个范围内的元素及其频率。像你提供的示例数组[3,1,1,1,13,13,13,13,13,8,8,8,8,8,8],频率最高的8是第1位,13是第2位,1是第3位,3是第4位,所以范围[2,4]就需要输出这三个元素的对应信息。
实现步骤
我把整个流程拆成几个清晰的环节,方便理解和编码:
- 步骤1:统计元素频率:用哈希表(比如Java的
HashMap<Integer, Integer>)记录每个整数的出现次数,遍历数组一次就能完成统计。 - 步骤2:按频率排序:把哈希表的键值对转换成列表,自定义排序规则——优先按频率降序排列;如果频率相同,可选择按元素值升序或保持原数组出现顺序(示例无此场景,这里先按频率降序处理)。
- 步骤3:筛选位次范围:注意位次是从1开始计数的(最频繁的元素为第1位),所以要把传入的位次范围转换成列表的索引范围(比如
[2,4]对应索引1到3,因为列表索引从0开始)。 - 步骤4:格式化输出:按照要求的格式拼接并打印每个元素和它的频率。
Java代码示例
下面是完整的可运行代码,包含详细注释:
import java.util.*; public class FrequencyRangePrinter { public static void printElementsByFrequencyRange(int[] arr, int[] range) { // 步骤1:统计每个元素的出现频率 Map<Integer, Integer> frequencyMap = new HashMap<>(); for (int num : arr) { frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1); } // 步骤2:将键值对转为列表,按频率降序排序;频率相同时按元素值升序(可按需调整) List<Map.Entry<Integer, Integer>> sortedEntries = new ArrayList<>(frequencyMap.entrySet()); sortedEntries.sort((entry1, entry2) -> { int freqCompare = entry2.getValue().compareTo(entry1.getValue()); if (freqCompare != 0) { return freqCompare; } return entry1.getKey().compareTo(entry2.getKey()); }); // 步骤3:检查位次范围的有效性,避免索引越界 int startRank = range[0]; int endRank = range[1]; if (startRank < 1 || endRank > sortedEntries.size() || startRank > endRank) { System.out.println("Invalid rank range!"); return; } // 步骤4:格式化输出结果 StringBuilder output = new StringBuilder(); for (int i = startRank - 1; i < endRank; i++) { Map.Entry<Integer, Integer> entry = sortedEntries.get(i); output.append(String.format("Value: %d. Frequency: %d ", entry.getKey(), entry.getValue())); } // 移除末尾多余空格后打印 System.out.println(output.toString().trim()); } // 测试示例场景 public static void main(String[] args) { int[] sampleArr = {3, 1, 1, 1, 13, 13, 13, 13, 13, 8, 8, 8, 8, 8, 8}; int[] rankRange = {2, 4}; printElementsByFrequencyRange(sampleArr, rankRange); // 输出结果:Value: 13. Frequency: 5 Value: 1. Frequency: 3 Value: 3. Frequency: 1 } }
代码细节说明
- 频率统计:用
HashMap的getOrDefault方法简化计数逻辑,无需额外判断元素是否已存在。 - 排序逻辑:自定义比较器实现按频率降序,频率相同时默认按元素值升序,你也可以改成按元素在原数组中首次出现的顺序(需要额外记录首次出现的索引)。
- 边界校验:加入了范围有效性检查,防止传入
[0,5]或[5,3]这类无效范围导致程序报错。 - 输出优化:用
StringBuilder拼接结果,避免频繁字符串拼接的性能损耗,最后移除末尾多余空格保证格式整洁。
内容的提问来源于stack exchange,提问作者0jnats3
相关产品推荐
相关产品推荐

