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

如何修复Java代码中的‘Syntax error on tokens, ( expected instead’错误

修复你的Route类语法错误

我帮你梳理了这三处语法错误的根源,以及对应的修复方案:

错误1:变量命名冲突

你在getTotalDistance方法里提前定义了局部变量int x;,但紧接着的lambda表达式又用x作为参数名,这会让编译器混淆变量的作用域,直接触发语法错误。解决方法很简单,把lambda的参数名改成不重复的名称,比如city就行。

错误2:缺失ArrayList类导入

你的代码里大量使用了ArrayList,但文件顶部没有导入java.util.ArrayList,编译器无法识别这个类,也会间接引发语法提示异常。需要在导入语句里补上这一行。

错误3:返回值类型不匹配

getTotalDistance方法声明的返回类型是double,但你最后把计算结果强制转换成int再返回,这不仅不符合方法签名要求,还会丢失距离的小数精度。直接去掉(int)强制转换即可。

另外额外提一句:用indexOf获取元素索引的效率很低(ArrayList的indexOf是O(n)遍历),如果只是需要遍历相邻元素,后面我会给你一个更高效的写法作为优化建议。

修复后的完整代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class Route {
    private ArrayList<City> cities = new ArrayList<City>();

    public Route(ArrayList<City> cities) {
        this.cities.addAll(cities);
        Collections.shuffle(this.cities);
    }

    public Route(Route route) {
        this.cities.addAll(route.cities);
    }

    public ArrayList<City> getCities() {
        return cities;
    }

    public double getTotalDistance() {
        int citiesSize = this.cities.size();
        // 移除多余的int x;声明,避免和lambda参数冲突
        double total = this.cities.stream().mapToDouble(city -> {
            int cityIndex = this.cities.indexOf(city);
            double returnValue = 0;
            if (cityIndex < citiesSize - 1) {
                returnValue = city.measureDistance(this.cities.get(cityIndex + 1));
            }
            return returnValue;
        }).sum();
        // 加上首尾城市的距离,去掉(int)强制转换以匹配double返回类型
        total += this.cities.get(citiesSize - 1).measureDistance(this.cities.get(0));
        return total;
    }

    public String getTotalStringDistance() {
        String returnValue = String.format("%.2f", this.getTotalDistance());
        if (returnValue.length() == 7) {
            return " " + returnValue;
        }
        return returnValue;
    }

    public String toString() {
        return Arrays.toString(cities.toArray());
    }
}

优化建议(可选)

如果你的城市列表元素较多,建议改用IntStream遍历索引的方式,避免indexOf的低效遍历,性能会更好:

public double getTotalDistance() {
    int citiesSize = this.cities.size();
    if (citiesSize < 2) return 0.0;
    // 直接通过索引遍历相邻城市计算距离
    double total = IntStream.range(0, citiesSize - 1)
            .mapToDouble(i -> cities.get(i).measureDistance(cities.get(i + 1)))
            .sum();
    // 加上首尾城市的闭环距离
    total += cities.get(citiesSize - 1).measureDistance(cities.get(0));
    return total;
}

内容的提问来源于stack exchange,提问作者Muhammad Widayat Akbar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:03:38