You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:25:15