有没有人帮我看看这个题该咋做!

timi先生
全栈领域新星创作者
2020-08-12 08:22:09
class Beach implements Comparable<Beach> {
private String name;
private float distance;
private int quality;

public Beach(String name, float distance, int quality) {
this.name = name;
this.distance = distance;
this.quality = quality;
}

public synchronized String getName() {
return name;
}

public synchronized void setName(String name) {
this.name = name;
}

public synchronized float getDistance() {
return distance;
}

public synchronized void setDistance(float distance) {
this.distance = distance;
}

public synchronized int getQuality() {
return quality;
}

public synchronized void setQuality(int quality) {
this.quality = quality;
}

public synchronized static void main(String[] args) {

}

@Override
public synchronized int compareTo(Beach o) {

if (quality - o.getQuality() != 0 && distance - o.getDistance() !=0) {
return (int) ((quality - o.getQuality()) + ((int)distance-o.getDistance()));
}else {
return 0;
}

}
}

要求:
Beach 类必须具有三个字段:String name、float distance、int quality。
Beach 类应实现 Comparable<Beach> 接口。
Beach 类的 compareTo 方法应至少需要有海滩 quality 和 distance。
除 main 方法外,所有 Beach 类的方法都必须为 synchronized.

我的程序如上所示,现在第三个要求未达到,系统提示::确保 x.compareTo(y) == -y.compareTo(x)。
这个该咋做才能满足题中要求!
...全文
9381 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2020-08-18
  • 打赏
  • 举报
回复
引用 12 楼 任何时候努力都不会迟 的回复:
还是提示确保 compareTo 为不同的对象返回不同的值。

public synchronized int compareTo(Beach o) {
if(this == o)
return 0;
else {
int i = Integer.compare(this.quality, o.quality);
int f = Float.compare(this.distance, o.distance);
int r = i + -f;
return r;
}
}

我偷看了老外的答案是上面那个,他的i和f值是咋得的, Float.compare(this.distance, o.distance);这个语句是什么意思


没看出老外的有啥特殊啊,除了直接用属性而不是用方法。调用o的synchronized方法不能保证原子性,但访问o的属性也一样的不能保证原子性啊,除非在compareTo里锁o对象,但那样容易造成死锁。
主要是不理解【还是提示确保 compareTo 为不同的对象返回不同的值。】,怎样才算为不同的对象返回不同的值。
为啥老外的就算可以,不同对象,compareTo返回结果一样也是又可能的呀。
public synchronized int compareTo(Beach o) { //模仿老外,改成以下试试?
return Integer.compare(quality, o.quality) + Float.compare(distance, o.distance);
}

我觉得if (this == o) 这个判断没意义,因为compareTo是synchronized,如果参数o和this指向同一对象,compareTo方法外不能用方法改变o属性的,所以直接return也能保证返回0,所以这个判断不判断应该关系不大。else部分,分开计算再return和直接return也没区别(原子性问题是一样的)
搞不懂了,没看出老外的代码是怎么保证【compareTo 为不同的对象返回不同的值】的。





qq_39936465 2020-08-18
  • 打赏
  • 举报
回复
我前面的程序写错了,参照10楼。
qq_39936465 2020-08-18
  • 打赏
  • 举报
回复
引用 12 楼 任何时候努力都不会迟 的回复:
我偷看了老外的答案是上面那个,他的i和f值是咋得的, Float.compare(this.distance, o.distance);这个语句是什么意思



因为变量distance是float,如果2者相差小于1,你源程序会自动取整变成0,区分不了小于1的差别。
timi先生 2020-08-18
  • 打赏
  • 举报
回复
引用 11 楼 qybao 的回复:
没注意到distance是float类型
public synchronized int compareTo(Beach o) { //直接return就好了,没必要if else判断
    return (quality-o.getQuality()) + Float.compare(distance, o.getDistance());
}
还是提示确保 compareTo 为不同的对象返回不同的值。
public synchronized int compareTo(Beach o) {
   if(this == o)
            return 0;
        else {
            int i = Integer.compare(this.quality, o.quality);
            int f = Float.compare(this.distance, o.distance);
            int r = i + -f;
            return r;
        }
    }
我偷看了老外的答案是上面那个,他的i和f值是咋得的, Float.compare(this.distance, o.distance);这个语句是什么意思
qybao 2020-08-18
  • 打赏
  • 举报
回复
没注意到distance是float类型
public synchronized int compareTo(Beach o) { //直接return就好了,没必要if else判断
return (quality-o.getQuality()) + Float.compare(distance, o.getDistance());
}
qq_39936465 2020-08-18
  • 打赏
  • 举报
回复
引用 8 楼 任何时候努力都不会迟 的回复:
[quote=引用 7 楼 qq_39936465 的回复:]

 public synchronized int compareTo(Beach o) {
   
     if (quality - o.getQuality() == 0 && distance - o.getDistance() ==0) {
            return 0;
        }else {
            return (quality - o.getQuality()) + Float.compare(distance-o.getDistance()));
        }
      
    }
这个报错的[/quote] 抱歉是我写错了

public synchronized int compareTo(Beach o) {

		if (quality - o.getQuality() == 0 && distance - o.getDistance() == 0) {
			return 0;
		} else {
			return (quality - o.getQuality()) + Float.compare(distance, o.getDistance());
		}

	}
鱼鱼_kqs 2020-08-17
  • 打赏
  • 举报
回复
这个方法是用来排序的 你的逻辑有问题 你看看我这样写你能用不
timi先生 2020-08-17
  • 打赏
  • 举报
回复
引用 7 楼 qq_39936465 的回复:

 public synchronized int compareTo(Beach o) {
   
     if (quality - o.getQuality() == 0 && distance - o.getDistance() ==0) {
            return 0;
        }else {
            return (quality - o.getQuality()) + Float.compare(distance-o.getDistance()));
        }
      
    }
这个报错的
qq_39936465 2020-08-17
  • 打赏
  • 举报
回复

 public synchronized int compareTo(Beach o) {
   
     if (quality - o.getQuality() == 0 && distance - o.getDistance() ==0) {
            return 0;
        }else {
            return (quality - o.getQuality()) + Float.compare(distance-o.getDistance()));
        }
      
    }
qq_39936465 2020-08-17
  • 打赏
  • 举报
回复
引用 5 楼 任何时候努力都不会迟 的回复:
不行的,大哥们。改了后所让不报之前那个错了,但第三个要求还是不满足,提示变成了:确保 compareTo 为不同的对象返回不同的值。
变量是float类型 ,需要用Float.compare(f1,f2),强制int不行。
qq_39936465 2020-08-13
  • 打赏
  • 举报
回复
引用 楼主 任何时候努力都不会迟 的回复:
要求: Beach 类必须具有三个字段:String name、float distance、int quality。 Beach 类应实现 Comparable<Beach> 接口。 Beach 类的 compareTo 方法应至少需要有海滩 quality 和 distance。 除 main 方法外,所有 Beach 类的方法都必须为 synchronized. 我的程序如上所示,现在第三个要求未达到,系统提示::确保 x.compareTo(y) == -y.compareTo(x)。 这个该咋做才能满足题中要求!
你的程序逻辑有问题,没考虑到quality一样 distance不一样或者,distance一样,quality不一样的情况。这2种情况在你的比较中都是0这个显然是由问题的。 反一下

 public synchronized int compareTo(Beach o) {
   
     if (quality - o.getQuality() == 0 && distance - o.getDistance() ==0) {
            return 0;
        }else {
            return  (int) ((quality - o.getQuality()) + (int)(distance-o.getDistance()));
        }
      
    }
[/quote]
timi先生 2020-08-13
  • 打赏
  • 举报
回复
不行的,大哥们。改了后所让不报之前那个错了,但第三个要求还是不满足,提示变成了:确保 compareTo 为不同的对象返回不同的值。
爱吃鱼的ねこ 2020-08-13
  • 打赏
  • 举报
回复
你这不符合自反性,你可以把字段分开判断,先判断quality,如果quality一样,就判断distance。就是相当于实现一个排序算法,让你以quality和distance升序/降序,如果quality相同,以distance升序/降序。
qybao 2020-08-12
  • 打赏
  • 举报
回复
直接return就好了,不需要if else 即 public synchronized int compareTo(Beach o) { return (quality-o.getQuality()) + (distance-o.getDistance()); } 如果相同,自然计算结果就是0了,所以不用if else;如果不等,也能保证x.compareTo(y)==-y.compareTo(x)
hober.z 2020-08-12
  • 打赏
  • 举报
回复

@Override
    public synchronized int compareTo(Beach o) {
        if (quality != o.getQuality()) {
            return quality > o.getQuality() ? 1 : -1;
        }
        if (distance != o.getDistance()) {
            return distance > o.getDistance() ? 1 : -1;
        }
        return 0;
    }

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧