为二次函数对象定义比较器

时间:2014-01-27 03:08:22

标签: java method-overriding

这是我的任务, a)用int系数a,b,c写出表示二次方ax ^ 2 + bx + c的二次函数。为a,b,c提供带有3个int参数的构造函数。提供方法double valueAt(double x)在x处返回此二次函数的值。还提供了toString方法。

b)覆盖equals方法quadraticmethod类。如果两个二次函数各自的系数相等则应该被认为是相等的

c)使功能对象具有可比性。如果相等比较b,则compareTo应首先比较1,如果相等,则比较c

d)定义比较器类,用于比较两个QuadraticFunction对象。提供两个构造函数:一个no-argss构造函数和一个带有1个double参数的构造函数。当一个比较器由no-args构造函数创建时,它应该根据它们在x = 0时的值来比较两个quadraticFunction;当构造函数使用参数x创建比较器时,它应该基于它们在x的值来比较quadraticFunction

这是我的代码

我需要D部分的帮助,我不知道如何做一些

    public class Ex4
    {
    int a;
    int b;
    int c;

 public Ex4(int x, int y, int z)
 {
    a = x; b=y; c=z;
 }
 public String toString()
 {
    String X="";
    X= X+a+"x^2"+b+"x"+ "+" + c;
    return X;
 }
 public double valueAt(double x)
 {
    return (a*x*x+b*x+c);
 }
 //////// Part B
 public boolean equals( Ex4 qf )
 {
    return(this.a==qf.a && this.b==qf.b && this.c==qf.c);
 }
 /////Part c
//   public int compareTo(Ex4 other)

//   {

//      if (a.equals(other.a))
//      {

//          if (b.equals(other.b))

//              return c.compareTo(other.c);

//          return b.comapreTo(other.b);

//          }

//    return a.compareTo(other.a);

//  }

public int compareTo(Ex4 other)
{
    if (a > other.a)
        return 1;
    else if (a < other.a)
        return -1;
    else if (b > other.b)
        return 1;
    else if (b < other.b)
        return -1;
    else if (c > other.c)
        return 1;
    else if (c < other.c)
        return -1;
    else
        return 0;
}
////Part d

 public static void main(String[] args)
 {
    System.out.println(new Ex3(1, -5, 6));
 }
}

同样在取消注释c部分下的代码区域时,它表示int不能在第29,31,32,33和35行中取消引用 谢谢你的帮助

3 个答案:

答案 0 :(得分:0)

你不能在简单的原语上调用方法。

更好的选择是使用Integer的静态方法Integer.compare(int a, int b)来比较两个整数。

答案 1 :(得分:0)

首先,编写自定义Comparator并不是非常困难;你需要了解一个人的基本结构。

这是一个想法:它有点像你在写Comparable实体。

class CustomComparator implements Comparator<Ex4> {

    @Override
    public int compare(Ex4 left, Ex4 right) {
        // Compare the entities as specified by the assignment
    }
}

然后,您需要接受它作为构造函数参数。那,我作为练习留给读者。

现在,对于语法问题:您将原始int视为Integer,其中 equals方法。基元不是对象,因此不能解除引用。在这种情况下,您将需要使用常规等价运算符(==, >, <)。您已经在第二个定义的compareTo方法中解决了这个问题。

编辑:重新阅读您的要求后,我开始认为您的原始字段不是正确的方法。你应该:

  • 将您的字段从int更改为Integer
  • 在您的实体类上实施Comparable<Ex4>
  • 依赖于compareTo() Integer的默认行为;也就是说,您的注释代码应“正常工作”(除了与C进行比较时拼写错误)
  • 将辅助compareTo移至其自己的Comparator实体,如上所述。

答案 2 :(得分:0)

试试这个

import java.util.Comparator;
public class Ex4Comparator implements Comparator<Ex4> {
    private double x = 0.0;

    public Ex4Comparator() {
    }

    public Ex4Comparator(double x) {
        this.x = x;
    }

    @Override
    public int compare(Ex4 o1, Ex4 o2) {
        return Double.compare(o1.valueAt(x), o2.valueAt(x));
    }
}

此外,您的equals方法不会覆盖Object的equals方法。您可能希望将其更改为

@Override
public boolean equals(Object o) {
    if (o instanceof Ex4) {
        Ex4 other = (Ex4)o;
        return (a == other.a && b == other.b && c == other.c);
    }
    return false;
}