compareTo方法与双精度浮点数[Double不能被引用]

3
今天我正在开发一个新程序,用于在一个充满数据的文件中找到最便宜的披萨。然而,我完全卡在了一个问题上,就是使用compareTo方法。我在我的资源类中创建了它,但是我收到了错误消息,说double不能被取消引用,我查看了这个问题,但还是没有得到帮助。我不是最高级的程序员,也不理解其他资源上的许多复杂答案。我的程序规格如下:
B. CheapPizza.java a. 目标 - 在Pizza.java中实现Comparable接口。 b. 分配 - 使用您复制到第10章中的Pizza.java文件。实现Comparable接口并添加compareTo()方法。这个compareTo()应该用来帮助你在pizza.txt中找到最便宜的披萨。编写CheapPizza.java客户端类来测试Pizza.java的新版本。CheapPizza将从文件中读取披萨,并通过使用compareTo()方法来跟踪最便宜的披萨。创建一个Pizza对象来保存最便宜的披萨和一个Pizza对象来从文件中读取披萨。使用compareTo()来比较最便宜的披萨和从文件中读取的披萨。如果从文件中读取的披萨更便宜,则更改最便宜的披萨。 a. 输入 - Blackboard上的pizzas.txt文件。 b. 输出 - 应该完全按照下面的格式显示: The cheapest pizza: The 9 inch olive pizza will cost $7.99
compareTo方法的代码在我的代码底部,请有人能给我解释一下我做错了什么吗?谢谢你的时间,祝你有愉快的一天!~
public class Pizza   {   
    private int size;
    private double cost;
    private String topping;

    public Pizza(int s, double c, String t)
    {
       size = s;
       cost = c;
       topping = t;
    }
    public Pizza(String t, int s, double c) //.equals Method For Comparing Pizza for ''PizzaMatch''
    {
       topping = t;
       size = s;
       cost = c;

    }

    public Pizza()
    {
       size = 10;
       cost = 9.00;
       topping = "Cheese";
    }

    public String toString()
    {
       return String.format("%d inch %s pizza will cost $%.2f", size, topping, cost);
    }
    public int getSize()
    {
       return size;
    }
    public void setSize(int s)
    {
       size = s;
    }

    public double getCost()
    {
       return cost;
    }
    public void setCost(Double c)
    {
       cost = c;  
    }
    public String getTopping()
    {
       return topping;   
    }
    public void setTopping(String t)
    {
       topping = t;
    }

    public boolean equals(Object obj) //.equals Method For Comparing Pizza in "PizzaMatch"
    {
       if(!(obj instanceof Pizza)) 
          throw new IllegalArgumentException("Parameter must be of Pizza!");

       Pizza temp = (Pizza) obj;

       if (this.topping.equals(temp.topping) && this.size == temp.size  && this.cost == temp.cost)
          return true;
       else 
          return false;

    }
    //============================================================================================
    public int compareTo(Object obj){
        if(!(obj instanceof Pizza))
            throw new IllegalArgumentException
                ("Parameter must be a Pizza");
        Pizza temp = (Pizza) obj;  
        if (this.cost.compareTo(temp.cost) < 0) //this comes 1st
            return -1;
        else if(this.cost.compareTo(temp.cost) > 0) //temp comes 1st
            return 1;
        else //this and temp are equal
             return 0;
    }
}

不要对原始类型使用 compareTo,因为 double 是原始类型。 直接进行比较,例如 this.cost < temp.cost - GriffeyDog
非常感谢提供的信息! - user3337381
3个回答

3
       if(!(obj instanceof Pizza))
            throw new IllegalArgumentException
            ("Parameter must be a Pizza");
        Pizza temp = (Pizza) obj;  
        return Double.valueOf(this.cost).compareTo(Double.valueOf(temp.cost));

成本是原始的双精度浮点数。CompareTo是对象中的一个方法。因此,您可以使用Double对象而不是double,或者简单地使用算术运算。


我很感激你的帮助,因为我从未接受过这方面的教育,所以很高兴有人能够向我解释这个问题! - user3337381

2

你需要在Pizza类中实现java.lang.Comparable接口

public class Pizza implements Comparator<Pizza> {
    // Enter other codes
    // with toString

   @Override
   public int compareTo(Pizza o) {
        return  Double.valueOf(this.cost).compareTo(Double.valueOf(o.cost));
   }
}

然后使用Collections.sort(listOfPizzas)按照成本对比萨进行排序。
public static void main(String[] args) {
    List l = new ArrayList();
    l.add(new Pizza(9, 7.99, "Olive Pizza"));
    l.add(new Pizza(9, 8.99, "Hot & Spicy Chicken Pizza"));
    l.add(new Pizza(9, 9.99, "Corned Mutton Sensation Pizza"));
    Collections.sort(l);
    System.out.println(" " + l.get(0));
}

谢谢你让我知道这种新的数据排序方法,我很感激! - user3337381

2

cost 是一个原始类型为 double 的字段,你不能在原始类型上调用方法(在你的情况下是 compareTo()),只能在对象上调用。要比较两个双精度浮点数,直接比较它们即可。

 if (this.cost < temp.cost)
    return -1;
 else if(this.cost > temp.cost)
    return 1;
 else
    return 0;

这将修复一个错误,但他们仍然会遇到temp.cost是私有变量且无法被compareTo方法访问的问题。 - Eric Palace
1
不,因为它也是“Pizza”类的一个方法,因此可以访问它的私有变量。 - Marv
哦,我想它可以。我的错。 - Eric Palace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接