家庭作业帮助,Java Pair class

时间:2016-01-24 19:43:16

标签: java generics

我有一个家庭作业来比较我在一个类中创建的通用Pair,并将它发送到测试器类进行比较,它应该返回true。我无法弄清楚我做错了什么。我想在尝试比较两个对象时可能是我的equals方法。当我认为我在正确的轨道上时,我得到StackOverflow异常。这是我的代码的一部分:

import java.util.ArrayList;

public class Pair<T1,T2> implements PairInterface<T1,T2>
{
    private T1 aFirst;
    private T2 aSecond;
    Pair p1 = new Pair(aFirst,aSecond);

    public Pair(T1 aFirst, T2 aSecond)
    {

            this.aFirst = aFirst;
            this.aSecond = aSecond;

    }

    /**
     * Gets the first element of this pair.
     * @return the first element of this pair.
     */
    public T1 fst()
    {
        return aFirst;
    }

    /**
     * Gets the second element of this pair.
     * @return the second element of this pair.
     */
    public T2 snd()
    {
        return aSecond;
    }

    /**
     * Sets the first element to aFirst.
     * @param aFirst  the new first element
     */
    public void setFst(T1 aFirst)
    {
        this.aFirst = aFirst;
    }

    /**
     * Sets the second element to aSecond.
     * @param aSecond  the new second element
     */
    public void setSnd(T2 aSecond)
    {
        this.aSecond = aSecond;
    }

    /**
     * Checks whether two pairs are equal. Note that the pair
     * (a,b) is equal to the pair (x,y) if and only if a is
     * equal to x and b is equal to y.
     * @return true if this pair is equal to aPair. Otherwise
     * return false.
     */
        @Override
    public boolean equals(Object otherObject)
    {

        Pair p2 = (Pair) otherObject;

        if(otherObject == null)
        {
            return false;
        }

        if(getClass() != otherObject.getClass())
        {
            return false;
        }
                if(p1.equals(p2)){
                    return true;
                }else{
                    return false;
                }



        }



    /**
     * Generates a string representing this pair. Note that
     * the String representing the pair (x,y) is "(x,y)". There
     * is no whitespace unless x or y or both contain whitespace
     * themselves.
     * @return a string representing this pair.
     */
        @Override
    public String toString()
    {
        return new StringBuilder().append('(').append(fst()).append(',').append(snd()).appen         d(')').toString();
    }
}

2 个答案:

答案 0 :(得分:1)

首先,您为什么要创建班级的新实例?

Pair p1 = new Pair(aFirst,aSecond);

您应该这样做,当您使用构造函数创建对象时,您的字段将被初始化。

其次,你在equals方法中有一个递归问题,它在内部调用equals。

你必须将equals方法更改为类似的方法

Pair p2 = (Pair) otherObject;

      if (otherObject == null) {
         return false;
      }

      if (this == otherObject) {
         return true;
      }

      if (getClass() != otherObject.getClass()) {
         return false;
      }

      return this.aFirst.equals(p2.aFirst)
            && this.aSecond.equals(p2.aSecond);

答案 1 :(得分:0)

在递归(一个提示)中抛出

StackOverFlowException(大多数时候)。

查看你的&#39; equals()`方法:如果q1.equals(q2),你就会这么做。
equals调用equals ...(它将使用相同的方法检查q2是否等于q1)

要解决此问题,您必须使用equals方法而不使用&#39; equals&#39;再次在里面。

我们是怎么做到的?
好吧,你想知道两个对象中的值是否相等 您应该重新编写它并检查值是否等于,而不是它们自己的对象,至少不是equals()