寻找身高相近的小朋友
算法实现思路
- 输入数据
- main 方法中,通过 Scanner 类从标准输入(通常是键盘)读取两个整数 h 和 n。
- h 表示目标高度,n 表示接下来要输入的高度数组的元素个数。
- 使用循环读取 n 个整数,并将它们存储在 Integer 数组 heights 中。
- 排序算法
- getResult 方法负责根据给定的目标高度 h 对 heights 数组进行排序。
- 使用 Arrays.sort 方法对数组进行排序,并传入一个自定义的比较器(Lambda 表达式)。
- 比较器首先计算每个高度值与目标高度 h 的绝对差值 absA 和 absB。
- 如果两个绝对差值不相等,则根据差值的大小进行排序(差值越小,排序越靠前)。
- 如果两个绝对差值相等,则按照原数组中的顺序(即自然顺序)进行排序,这里使用 a - b 来确保升序排序。
- 结果输出
- 排序完成后,使用 StringJoiner 类将排序后的高度值拼接成一个由空格分隔的字符串。
- 返回这个字符串,并在 main 方法中打印出来。
使用到的算法思想
- 排序算法:本程序使用了自定义排序算法,具体是通过 Arrays.sort 方法和一个比较器实现的。比较器根据每个元素与目标值 h 的绝对差值以及元素之间的自然顺序进行排序。
- Lambda 表达式:在 Arrays.sort 方法中,使用了 Lambda 表达式来定义比较器,这是一种简洁的函数式编程风格。
数据结构设计
- 数组:使用 Integer 数组 heights 来存储输入的多个高度值。数组是一种线性数据结构,适合存储固定大小的同类型数据。
- Scanner:Scanner 类用于从标准输入读取数据。它提供了一种便捷的方式来读取各种基本类型和字符串。
- StringJoiner:StringJoiner 类用于构建一系列由特定分隔符(这里是空格)连接的字符串。它提供了简洁的方法来添加和合并字符串,避免了手动拼接字符串时可能出现的性能问题。
- 输入处理:程序首先处理输入,读取目标高度 h 和高度数组的元素个数 n,然后读取 n 个高度值并存储在数组中。
- 排序策略:定义了一个自定义排序策略,即先按与目标高度的绝对差值排序,差值相等时再按自然顺序排序。
- 比较器实现:使用 Lambda 表达式实现了一个比较器,该比较器遵循上述排序策略。
- 排序执行:调用 Arrays.sort 方法对数组进行排序,传入自定义的比较器作为参数。
- 结果构建:使用 StringJoiner 类将排序后的数组元素转换为一个由空格分隔的字符串。
- 结果输出:将构建好的字符串返回并在 main 方法中打印到控制台。