我已经调试了这个问题一个多小时了,不知道出了什么问题。我试图简单地比较两个整数并将较小的一个存储到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街。

这是控制台输出:

java - 绝对值计算不起作用…?-LMLPHP

有人知道这里发生了什么吗?

最佳答案

问题似乎是,对于Ames Street,num为负数,因此tempDistance变为负数,因此以后的检查都不适用,因为abs数不能小于负数。

您可能应该做tempDistance = Math.abs(num);

但是,这可能仍然是错误的,因为xLocaleyLocale可能彼此“抵消”,如果两者都很大,一个为正,一个为负。因此,此时您应该已经使用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();

09-25 21:39