我已经调试了这个问题一个多小时了,不知道出了什么问题。我试图简单地比较两个整数并将较小的整数存储到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 street。
这是控制台输出:
有人知道这里发生了什么吗?
答案 0 :(得分:4)
问题似乎是,对于艾姆斯街,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();