代码之家  ›  专栏  ›  技术社区  ›  Ishmael

如何编写.add()方法?[已关闭]

  •  0
  • Ishmael  · 技术社区  · 11 年前

    这是一个家庭作业问题,我很难理解如何在Distance类中创建.add()方法。

    class Distance有两个整数实例变量:

    private int feet;
    private int inches;
    

    它有一个无参数构造函数,用于初始化零英尺零英寸的Distance。

    它有一个双参数构造函数,它接受英尺和英寸的两个正整数,如果它们为负或英寸大于11,则抛出和异常。

    它还具有用于实例变量的get/set方法。我的获取/设置方法:

    public void setFeet(int f){
        feet = f;
    }
    
    public void setInches(int in){
        inches = in;
    }
    
    public int getFeet(){
        return feet;
    }
    
    public int getInches(){
        return inches;
    }
    

    我想问的第一个问题是:我应该这样设置这些获取/设置方法吗?我对自己没有把握。

    我的第二个问题在于创建一个方法add(),该方法将另一个Distance对象添加到它自己。也就是说,

    w1 = new Distance(4,9);
    w2 = new Distance(3,6);
    w1.add(w2); //w1 becomes 8 feet, 3 inches.
    

    到目前为止,我有这个:

        public int add(Distance d) {
        int df = d.getFeet();
        int di = d.getInches();
        int a = this.feet;
        int b = this.inches;
        int c = a.getFeet();
        int d = b.getInches();
        int sumInches, sumFeet, temp;
        sumInches =di + d;
        sumFeet = df + c;
        if (sumInches>11) {
            temp = sumInches-11;
            sumFeet = sumFeet+1;
            sumInches = temp;
        }
        this.feet = sumFeet;
        this.inches = sumInches;
    }
    

    但我不确定这是否会编译(我现在无法访问可以安装编译器的计算机)。有人能检查一下并向我解释为什么这可能是错误的吗?

    7 回复  |  直到 11 年前
        1
  •  1
  •   Mordechai    11 年前
    int a = this.feet;
    int b = this.inches;
    

    有点冗长。。。

    int c = a.getFeet();
    int d = b.getInches();
    

    不会编译,调用原始值( int ,在我们的案例中)没有方法。


    这里有一个解决方案,(增加了对varargs的支持,允许无限 Distance s) 以下为:

    public void add(Distance... distance) {
        for(Distance d : distance) {
            feet += d.getFeet();
            if(inches + d.getInches >= 12)
                feet++;
            inches += d.getInches() % 12;
        }
    }
    

    有了这个,你可以很容易地添加如下内容:

    d1.add(d2, d3, d4, d5);
    
        2
  •  1
  •   Blake    11 年前
    public void setInches(int in){
        feet = in;
    }
    

    我认为这是一个拼写错误,因为您将in值指定为英尺而不是英寸。

    public int getInches(){
        return Inches;
    }
    

    又是一个打字错误。Java区分大小写,因此“英寸”与“英寸”不同。 除此之外,getter/setter看起来不错。

    至于add()方法。。。没有理由创建那些“a”、“b”、“c”和“d”变量

    int a = this.feet;
    int b = this.inches;
    int c = a.getFeet();
    int d = b.getInches();
    

    你可以直接使用this.feet和this.inches。这本身并没有错,只是不必要,而且会打乱代码。此外,我强烈建议始终创建有意义的变量名。“a”、“b”、“c”代码很难阅读。变量名称应具有表达能力。 此外,在你的算法中,你需要从相加的英寸中减去12。 因此,add方法可以写得更简洁,如下所示:

    public void add(Distance d)
    {
      int newFeet = this.feet + d.feet;
      int newInches = this.inches + d.inches;
      if (newInches > 11)
      {
         newFeet++;
         newInches = newInches - 12;
      }
      this.feet = newFeet;
      this.inches = newInches;
    } 
    

    就我个人而言,我会通过将所有内容转换为英寸,然后使用除法和模数运算符(%)来确定英尺和英寸来实现这一逻辑,但如果你愿意的话,我会把它留给你练习。

        3
  •  1
  •   d.moncada    11 年前

    我想问的第一个问题是:我应该这样设置这些获取/设置方法吗?我对自己没有把握。

    你的getter/setter看起来是正确的;他们的目的是 encapsulate 成员变量,这样它们就不会被意外地“修改”(限制访问)。您可能想将成员变量初始化为某个“默认”值——在这种情况下,我在下面将它们初始化为0。 笔记 :默认情况下,编译器会将它们初始化为0。

    private int feet = 0;
    private int inches = 0;
    
    public void setFeet(int f){
        feet = f;
    }
    
    public void setInches(int in){
        feet = in;
    }
    
    public int getFeet(){
        return feet;
    }
    
    public int getInches(){
        return inches;
    }
    

    我的第二个问题在于创建一个方法add()。

    关于“add”方法,您可能希望将局部变量更改为更具“描述性”的变量,从长远来看,这将有助于“可读性”和“可维护性”。

    由于“距离”类已经包含成员变量“英尺”和“英寸”,因此没有必要将这些值设置为局部变量。您可以直接访问它们——以及类的任何getter/setter。

       public int add(Distance newDistance) {
    
        int newDistanceFeet = newDistance.getFeet();
        int newDistanceInches = newDistance.getInches();
    
        int sumInches = newDistanceInches + this.getInches();
        int sumFeet = newDistanceFeet + this.getFeet();
    
        // Now we can check to see if any conversion are needed.. Note: 12 inches = 1 foot
        //   
        sumInches += (sumInches % 12);
        sumFeet += (sumInches / 12);
    
       // Now set the newly added inches/feet to the class's member variables
       //
       this.setFeet(sumFeet);
       this.setInches(sumInches);
    }
    
        4
  •  0
  •   DarknessBeginsHere    11 年前

    将您的add()更新为:-

    public int add(Distance d) {
        int df = d.getFeet();
        int di = d.getInches();
        int a = this.feet;
        int b = this.inches;
    

    错误 : c d integers 而不是 Distance 物体。你不需要 c and d 整数。

        int sumInches, sumFeet, temp;
        sumInches =di + b;
        sumFeet = df + a;
        if (sumInches>11) {
            temp = sumInches-11;
            sumFeet = sumFeet+1;
            sumInches = temp;
        }
        this.feet = sumFeet;
        this.inches = sumInches;
    
        5
  •  0
  •   swemon    11 年前

    你的问题就在这里,

    int a = this.feet;
    int b = this.inches;
    int c = a.getFeet();
    int d = b.getInches();
    

    由于a和b是int变量。它们没有getFeet()和getInches()方法。 将add()方法更改为

    public int add(Distance d) {
        int df = d.getFeet();
        int di = d.getInches();
        int sumInches, sumFeet, temp;
        sumInches =di + this.inches;
        sumFeet = df + this.feet;
        if (sumInches>11) {
            temp = sumInches-11;
            sumFeet = sumFeet+1;
            sumInches = temp;
        }
        this.feet = sumFeet;
        this.inches = sumInches;
    }
    
        6
  •  0
  •   Adrian    11 年前

    基本想法是正确的,但你做错了一些事情,请考虑:

    public int add( Distance d ){
      feet += d.feet;
      inches += d.inches;
      if( inches >= 12 ){
        inches = inches - 12;
        feet++;
      }
    }
    

    我看到的最大问题是

    int a = this.feet;
    int d = a.getFeet();
    

    这里a是int而不是Distance对象,因此不能调用getFeet()

        7
  •  0
  •   Joe2013    11 年前

    由于这是一个家庭作业问题,我没有提供完整的解决方案。由于您已经尝试了add方法,我将进一步优化它,并在此处提供相同的注释

    public void add(Distance distance) {
    
            int extraFeet=0;  /*Intializing the extra Feet*/
            extraFeet = (this.inches+distance.getInches())/11; /*Calculating the additional feet*/
            if(extraFeet >0)  
                this.inches = (this.inches+distance.getInches())%11;  /*if extra feet is greater than zero thn the remainder is the inches*/
            else
                this.inches +=distance.getInches(); /*else teh remainder is the sum of the inches*/
            this.feet += (distance.getFeet()+extraFeet);
    
    
        }