绝对值计算不起作用...?

时间:2018-12-03 17:31:03

标签: java

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

这是控制台输出:

enter image description here

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

1 个答案:

答案 0 :(得分:4)

问题似乎是,对于艾姆斯街,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();