如何修复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
相关产品推荐
相关产品推荐

