Java 使用方法equals()修复测试,并重写此方法和hashCode()
我试图测试我的代码,但最后一个System.out.printl没有回答,为什么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 " +
@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新手,我试图做得更好。