Flutter中如何查找与指定变量值最接近的数值?
解决思路
12个变量的规模下,用List实现和直接硬编码对比的性能差异可以完全忽略,优先选择可读性、可维护性更高的List方案。
方案1:List实现(推荐)
实现逻辑非常简单:
- 把12个int变量统一存入
List<Integer>集合 - 遍历集合计算每个元素和
a的差值的绝对值(避免正负值干扰判断) - 记录最小差值对应的数值即可
代码示例(Java)
import java.util.Arrays; import java.util.List; public class FindClosest { public static void main(String[] args) { // 基准值a int a = 10; // 你的12个对比变量示例 int n1 = 3, n2 = 15, n3 = 7, n4 = 22, n5 = 9, n6 = 12, n7 = 1, n8 = 18, n9 = 5, n10 = 11, n11 = 25, n12 = 0; // 把变量存入List List<Integer> numList = Arrays.asList(n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12); int closestNum = numList.get(0); int minDiff = Math.abs(closestNum - a); for (int num : numList) { int currentDiff = Math.abs(num - a); if (currentDiff < minDiff) { minDiff = currentDiff; closestNum = num; } } System.out.println("最接近的数值是:" + closestNum); } }
如果是Java 8及以上版本,还可以用Stream流简化遍历逻辑:
int closestNum = numList.stream() .min(Comparator.comparingInt(num -> Math.abs(num - a))) .get();
优势
后续如果需要增减对比的变量数量,只需要调整List里的元素即可,不需要修改核心对比逻辑,出错概率极低。
方案2:无集合硬编码实现
如果不想引入集合类,也可以用临时数组或者逐个对比的方式实现,12个变量的代码量也很小:
public class FindClosest { public static void main(String[] args) { int a = 10; int n1 = 3, n2 = 15, n3 = 7, n4 = 22, n5 = 9, n6 = 12, n7 = 1, n8 = 18, n9 = 5, n10 = 11, n11 = 25, n12 = 0; int closestNum = n1; int minDiff = Math.abs(n1 - a); // 逐个对比剩余变量 int[] temp = {n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12}; for (int num : temp) { int currentDiff = Math.abs(num - a); if (currentDiff < minDiff) { minDiff = currentDiff; closestNum = num; } } System.out.println("最接近的数值是:" + closestNum); } }
注意事项
- 计算差值必须用
Math.abs()取绝对值,否则会出现负数差值被误判为更小的问题 - 如果存在两个数值和
a的差值完全相同的场景(比如a=10,同时有8和12),可按需调整命中规则:如果要优先取更大的数值,把判断条件改为if (currentDiff < minDiff || (currentDiff == minDiff && num > closestNum))即可。
内容的提问来源于stack exchange,提问作者SuCKEE
相关产品推荐
相关产品推荐

