EditText中匹配指定值及查找最近值的代码实现方法
解决方案
首先先准备好指定的数值集合,为了高效完成后续的存在性检查和最接近值查找,建议用有序集合(比如TreeSet)或者先对数组做排序处理。
1. 判断输入值是否在指定集合中
核心步骤很直接:
- 从EditText里取出输入文本,转成数字(注意处理空输入、非数字输入的异常情况)
- 检查该数字是否存在于预定义的集合里
代码示例(Android Java)
// 预定义指定数值集合,用TreeSet实现有序存储 Set<Integer> targetNumbers = new TreeSet<>(Arrays.asList(420, 5430, 7420)); // 获取EditText输入并转换为数字 EditText inputEt = findViewById(R.id.input_edit_text); String inputStr = inputEt.getText().toString().trim(); if (TextUtils.isEmpty(inputStr)) { Toast.makeText(this, "请输入有效数字", Toast.LENGTH_SHORT).show(); return; } int inputNum; try { inputNum = Integer.parseInt(inputStr); } catch (NumberFormatException e) { Toast.makeText(this, "请输入正确的数字", Toast.LENGTH_SHORT).show(); return; } // 判断是否存在 boolean isExist = targetNumbers.contains(inputNum); if (isExist) { Toast.makeText(this, "输入值" + inputNum + "在指定集合中", Toast.LENGTH_SHORT).show(); } else { // 不存在则执行找最接近值的逻辑 int closestNum = findClosestNumber(targetNumbers, inputNum); Toast.makeText(this, "最接近的数值是" + closestNum, Toast.LENGTH_SHORT).show(); }
2. 查找与输入值最接近的指定数值
借助TreeSet的两个方法可以快速定位候选值:
floor(inputNum):返回集合里小于等于输入值的最大数ceiling(inputNum):返回集合里大于等于输入值的最小数
之后对比这两个候选值和输入值的差值,选差值更小的那个;如果其中一个不存在(比如输入值比所有集合值都小/大),直接取存在的那个即可。
查找最接近值的方法实现
private int findClosestNumber(Set<Integer> targetNumbers, int inputNum) { TreeSet<Integer> treeSet = (TreeSet<Integer>) targetNumbers; Integer floorNum = treeSet.floor(inputNum); Integer ceilingNum = treeSet.ceiling(inputNum); // 输入值比所有数都小 if (floorNum == null) { return ceilingNum; } // 输入值比所有数都大 if (ceilingNum == null) { return floorNum; } // 比较差值,返回更接近的数值 int diffFloor = inputNum - floorNum; int diffCeiling = ceilingNum - inputNum; return diffFloor <= diffCeiling ? floorNum : ceilingNum; }
补充说明
- 要是不想用
TreeSet,也可以把数值存入数组后先排序,再用二分查找判断存在性,同时通过二分查找的定位结果确定相邻候选值,逻辑和上面一致。 - 如果需要处理浮点数,只需把代码里的
Integer换成Double,parseInt换成parseDouble就行。
内容的提问来源于stack exchange,提问作者Best Thinking
相关产品推荐
相关产品推荐

