gpt4 book ai didi

java - 如何在罗马数字类上实现java.lang.Comparable接口(interface)?

转载 作者:行者123 更新时间:2023-12-01 09:35:33 25 4
gpt4 key购买 nike

我的下一个目标是在罗马数字转换器上实现 Comparable Interface。

也许我需要使用这样的界面:

public interface Comparable {
public int compareTo(Object x);
}

并在使用此指令实现 RomanNumber 后:

public class RomanNumber implements Comparable<RomanNumber>

但我不知道如何继续。我还需要在 JUnit 中测试这个新方法。我认为:

@Override
public int compareTo(Object o) {
if(this.number>((RomanNumber)o).convertToInteger()){
return 1;
} else if(this.number<((RomanNumber)o).convertToInteger()){
return -1;
} else{
return 0;
}
}
}

这是正在测试的代码:

public class RomanNumber{
private String number;
public RomanNumber (String number){
validateState(number);
this.number = number;
}
public int convertToInteger () {
int decimal = 0;
int lastNumber = 0;

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;
}
}
return decimal;
}

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");
}

@Override
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;
}
}

public int hashCode(){
return number.hashCode();
}
}

最佳答案

为您提供一些起点。

第一个单元测试可能看起来像

@Test
public void testConversionToIntegerD() {
assertThat(new RomanNumber("D").convertToInteger(), is(500));
}

你会编写很多这样的测试;并使它们变得更加复杂,以确保您的转换是正确的。(理想情况下,您应该在编写转换代码之前编写这些测试)。

为了与罗马数字进行比较......你知道,你已经实现了到整数的转换......也许,也许这可以给出如何与罗马数字进行比较的提示?!对此的测试可能如下所示:

@Test
public void testComparingDtoM() {
assertThat(new RomanNumber("D").compareTo(new RomanNumber("M")), is(-1));
}

还有一句警告:您需要花相当多的时间思考“极端情况”;那些漂亮的罗马数字确实很复杂。理想情况下,如果您在教室里做这件事,您应该让其他人编写测试用例。当您单独做这些事情时,您总是有可能在测试和支持实现中忽略这些“极端情况”。

(最后:我使用了 assertThat,因为这种断言风格允许编写各种良好的条件;唯一的缺点是您需要将它与 Hamcrest 匹配器一起使用,例如 。但认真地说:值得你花时间学习这些东西)

关于java - 如何在罗马数字类上实现java.lang.Comparable接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38978515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com