このリンクhttp://osherove.com/tdd-kata-1/からテスト駆動開発の次の演習を解決しようとしていますが、要件の終わり近くで立ち往生しています。
私はいつも正規表現を恐れていましたが、それを学ばなければならないようです。とにかく、私は次のことをしようとしています: - 文字列を取り、そこから数値を抽出して合計します。私を悩ませている要件は、
次のような複数の区切り文字を許可します: 「//[delim1][delim2]\n」、たとえば「//[*][%]\n1*2%3」は 6 を返す必要があります。長さのある複数の区切り文字も処理できることを確認してください。 1 文字より長い。
この要件は、改行記号で始まり改行記号で終わる文字列から 、 などdelim1
を抽出する必要があることを意味します。次に、これらの区切り記号を使用して、 の後の数字を抽出する必要があります。各区切り文字は角括弧で囲まれています。delim2
//
\n
\n
さて、正規表現を使用してJavaでそれを行うにはどうすればよいですか?
私が今まで持っているのは、上記のリンクの要件をカバーする次のコードです。
import java.util.ArrayList;
public class Calculator {
public String getDelimiter(String input) {
String delimiter = "";
String changeDelimiter = input.split("\\n")[0];
delimiter = changeDelimiter.substring(2);
return delimiter;
}
public int calculate(String input) {
String[] numbers;
if (input.contains("//")) {
String delimiter = getDelimiter(input);
System.out.println("aaaaaaaaaaaaaaaaaaaaaaa : " + delimiter); //testing the value
String calculation = input.split("\\n")[1];
numbers = calculation.split("[" + delimiter + "]+");
System.out.println("bbbbbbbbbbbbbbbbbbbbbbbb"); //testing the values
for (String number : numbers) {
System.out.print(number + ":");
// System.out.print(Integer.parseInt(number) + " ");
}
} else
numbers = input.split(",|\\n");
if (input.isEmpty()) {
return 0;
}
if (input.length() == 1) {
return Integer.parseInt(input);
}
else {
return getSum(numbers);
}
}
private int getSum(String[] numbers) throws IllegalArgumentException {
int sum = 0;
ArrayList<Integer> negatives = new ArrayList<Integer>();
for (int i = 0; i < numbers.length; i++) {
if (Integer.parseInt(numbers[i]) < 0) {
negatives.add(Integer.parseInt(numbers[i]));
}
if (Integer.parseInt(numbers[i]) >= 1000) {
continue;
} else
sum += Integer.parseInt(numbers[i]);
}
if (negatives.isEmpty()) {
return sum;
} else {
String negativeNumbers = "";
for (Integer number : negatives) {
negativeNumbers += number.toString() + " ";
}
throw new IllegalArgumentException("Negatives not allowed : " + negativeNumbers);
}
}
}