Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用方法equals()修复测试,并重写此方法和hashCode()_Java_Unit Testing_Object_Overriding_Roman Numerals - Fatal编程技术网

Java 使用方法equals()修复测试,并重写此方法和hashCode()

Java 使用方法equals()修复测试,并重写此方法和hashCode(),java,unit-testing,object,overriding,roman-numerals,Java,Unit Testing,Object,Overriding,Roman Numerals,我试图测试我的代码,但最后一个System.out.printl没有回答,为什么 @Test public void testcopy(){ RomanNumber rn1 = new RomanNumber("M"); RomanNumber rn2 = new RomanNumber("M"); RomanNumber rn1_copy = rn1; System.out.println("rn1 == rn1_copy is " +

我试图测试我的代码,但最后一个System.out.printl没有回答,为什么

@Test
public void testcopy(){
    RomanNumber rn1 = new RomanNumber("M");
    RomanNumber rn2 = new RomanNumber("M");
    RomanNumber rn1_copy = rn1;
    System.out.println("rn1 == rn1_copy is "
            + (rn1 == rn1_copy));
    System.out.println("rn1 == rn2 is " + (rn1 == rn2));
    System.out.println("rn1.equals(rn2) is " + (rn1.equals(rn2)));
}
同样,我想重写超类
对象
equals()
方法,我尝试了以下方法:

public boolean equals(Object obj) {
    if ((obj instanceof RomanNumber)) {
        RomanNumber decimal = (RomanNumber) obj;
        if (number == decimal.convertToInteger () && number.equals(decimal.convertToInteger) ) {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}
最后,我在下面发布了它生成的所有代码:

public class RomanNumber {

    private String number;

    public RomanNumber (String number){
        this.number = number;
    }

    /**
     * @return integer equivalent of this roman number
     */
    public int convertToInteger ()  {
        int decimal = 0;
        int lastNumber = 0;
        // take the string roman number
        // write algorithm to convert it to int
        // return int

        number = number.toUpperCase();
        for (int x = number.length() - 1; x >= 0; x--) {
            char convertNumber = number.charAt(x);
            switch (convertNumber) {
                case 'M':
                    decimal = processDecimal(1000, lastNumber, decimal);
                    lastNumber = 1000;
                    break;

                case 'D':
                    decimal = processDecimal(500, lastNumber, decimal);
                    lastNumber = 500;
                    break;

                case 'C':
                    decimal = processDecimal(100, lastNumber, decimal);
                    lastNumber = 100;
                    break;

                case 'L':
                    decimal = processDecimal(50, lastNumber, decimal);
                    lastNumber = 50;
                    break;

                case 'X':
                    decimal = processDecimal(10, lastNumber, decimal);
                    lastNumber = 10;
                    break;

                case 'V':
                    decimal = processDecimal(5, lastNumber, decimal);
                    lastNumber = 5;
                    break;

                case 'I':
                    decimal = processDecimal(1, lastNumber, decimal);
                    lastNumber = 1;
                    break;
            }
        }
        System.out.println(decimal);
        return decimal;
    }

    private static int processDecimal(int decimal, int lastNumber, int lastDecimal) {
        if (lastNumber > decimal) {
            return lastDecimal - decimal;
        } else {
            return lastDecimal + decimal;
        }
    }

    private void validateState(String number){
        if (number == null)
            throw new IllegalArgumentException("Null argument");

        if (number.isEmpty())
            throw new IllegalArgumentException("Empty string");


        if (!number.matches("^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$"))
            throw new IllegalArgumentException("Invalid Roman number");
    }

    public boolean equals(Object obj) {
        if ((obj instanceof RomanNumber)) {
            RomanNumber decimal = (RomanNumber) obj;
            if (number == decimal.convertToInteger () && number.equals(decimal.convertToInteger) ) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
}
多谢各位

您的第一期是

1) 操作数类型String和int不兼容

number == decimal.convertToInteger ()
不能直接比较字符串和int

您可以通过删除该行来解决问题

2)
number.equals(decimal.convertToInteger())

在这里,您传递的数字是
M
。 但是
decimal.convertToInteger()返回1000

所以这不适合比较两个相等的对象

如何修复

public boolean equals(Object obj){
    if ((obj instanceof RomanNumber)) {
        RomanNumber decimal = (RomanNumber)obj;
        if (number.equals(decimal.number)) {
            return true;
        }
        else {
            return false;
        }
    }
    else {
        return false;
    }
}

修理什么?什么坏了?什么是“last System.out.printl not answer”应该是什么意思?您忘记了此行末尾的
convertToInteger
函数的括号:
if(number==decimal.convertToInteger()&&number.equals(decimal.convertToInteger))
没错!谢谢你的解释。我是一名Java新手,我试图做得更好。