Java中如何按函数结果升序排序List?如何获取函数结果最小值?
问题分析与解决方案
问题描述
给定输入字符串列表:
["-5", "-12", "0", "20", "9", "-20", "37"]
需要实现以下需求:
- 按照函数
calc(x) = (5x)² + 3的计算结果升序排序该列表,得到期望输出:
["0", "-5", "9", "-12", "-20", "20", "37"]
- 获取所有元素通过该函数计算后的结果最小值
现有代码问题
提供的ListComparator类存在核心错误:compare方法违反了Comparator接口规范——它直接返回元素的整数值,而非返回负整数、零或正整数来表示两个元素的顺序关系。正确的返回逻辑应为:
- 若a的计算结果小于b的计算结果:返回负整数(表示a应排在b之前)
- 若a的计算结果大于b的计算结果:返回正整数(表示a应排在b之后)
- 若两者计算结果相等:返回0(表示两者顺序等价,可额外定义相等时的排序规则)
正确实现逻辑
1. 修复Comparator类
import java.util.Comparator; class ListComparator implements Comparator<String> { @Override public int compare(String a, String b) { int intA = Integer.parseInt(a); int intB = Integer.parseInt(b); int calculatedA = calc(intA); int calculatedB = calc(intB); // 按计算结果升序排序 if (calculatedA < calculatedB) { return -1; } else if (calculatedA > calculatedB) { return 1; } else { // 计算结果相等时,按原数值升序排序(可选规则) return Integer.compare(intA, intB); } } private int calc(int x) { double form = Math.pow(5 * x, 2) + 3; return (int) form; } }
2. 执行排序
使用修复后的Comparator对列表进行排序:
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Main { public static void main(String[] args) { List<String> inputList = new ArrayList<>(List.of("-5", "-12", "0", "20", "9", "-20", "37")); Collections.sort(inputList, new ListComparator()); // 输出排序后的列表,与期望结果一致 System.out.println(inputList); } }
3. 获取计算结果最小值
可以通过两种方式实现:
- 方式一:遍历列表计算每个元素的函数值,记录最小值
public static int getMinCalculatedValue(List<String> list) { ListComparator comparator = new ListComparator(); int min = Integer.MAX_VALUE; for (String s : list) { int num = Integer.parseInt(s); int calcVal = comparator.calc(num); if (calcVal < min) { min = calcVal; } } return min; }
- 方式二:利用已排序的列表,直接取第一个元素的计算结果(因为已按计算结果升序排列)
public static int getMinCalculatedValueFromSortedList(List<String> sortedList) { ListComparator comparator = new ListComparator(); int firstNum = Integer.parseInt(sortedList.get(0)); return comparator.calc(firstNum); }
内容的提问来源于stack exchange,提问作者DARA Solutions
相关产品推荐
相关产品推荐

