Моя следующая цель - реализовать Comparable Interface на конвертере римских номеров.Как реализовать интерфейс java.lang.Comparable по классу римского номера?
Может быть, мне нужно использовать интерфейс, как это:
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();
}
}
Ну, вам нужно добавить метод compareTo, и вам нужно написать логику, которая сравнивает два римских номера. Как вы узнаете, если один римский номер больше другого? Примените ту же логику к двум объектам, которые вы сравниваете. И в тесте Unit вам нужно проверить, что он работает, сравнивая несколько пар римских чисел. – RealSkeptic
@RealSkeptic: спасибо Я понимаю логику. – InExperience
Пожалуйста, отформатируйте свой код, чтобы он не прокручивался: удалите ненужные комментарии, пробелы и, самое главное, упростите код, чтобы показать точную проблему. – zhon