我已经调试了这个问题一个多小时了,不知道出了什么问题。我试图简单地比较两个整数并将较小的一个存储到tempDistance
变量。
但是,这每次都会继续失败。我不知道为什么。
观察:
public void park() {
StreetName temp = null;
int tempDistance = 10000;
for(StreetName street : streets) {
int yLocale = this.y - street.getY();
int xLocale = this.x - street.getX();
int num = yLocale + xLocale;
System.out.println(Math.abs(num) + " absolute value");
if(Math.abs(num) < tempDistance) {
tempDistance = num;
temp = street;
}
}
System.out.println("Parked at " + temp.getName());
street
值如下:streets.add(new StreetName("Ames Street", 0, 0));
streets.add(new StreetName("Nevada Street", 40, 0));
streets.add(new StreetName("Roland Street", 15, -30));
streets.add(new StreetName("Jordan Street", -15, -5));
streets.add(new StreetName("Granger Steet", -22, 20));
streets.add(new StreetName("Baxter Street", 75, 19));
streets.add(new StreetName("MinBurn Street", -35, 55));
当我输入“西15号,南5号”时,应该选择约旦街。而是继续选择Ames街。
这是控制台输出:
有人知道这里发生了什么吗?
最佳答案
问题似乎是,对于Ames Street,num
为负数,因此tempDistance
变为负数,因此以后的检查都不适用,因为abs
数不能小于负数。
您可能应该做tempDistance = Math.abs(num);
但是,这可能仍然是错误的,因为xLocale
和yLocale
可能彼此“抵消”,如果两者都很大,一个为正,一个为负。因此,此时您应该已经使用abs
了:
int num = Math.abs(yLocale) + Math.abs(xLocale);
最后,您可以将Java的
Stream
API的min
方法与特殊的Comparator结合使用,以使街道到当前位置的距离最小。StreetName temp = streets.stream().min(Comparator.comparing(street -> {
int yLocale = this.y - street.getY();
int xLocale = this.x - street.getX();
return Math.abs(yLocale) + Math.abs(xLocale);
})).get();