String newDate = date.replace(date.subString(date.indexOf("-")+1,date.lastIndexOf("-")),"October");
Давайте развернем это. Вы неявно
int firstHyphen = date.indexOf("-");
int lastHyphen = date.lastIndexOf("-");
Но для данной строки это то же самое, что сказать
int firstHyphen = 2;
int lastHyphen = 5;
Далее у вас есть неявное создание переменной
String month = date.subString(firstHyphen+1, lastHyphen);
Что совпадает с
String month = date.subString(3, 5);
Но какая подстрока начинается с 3 и заканчивается до 5?
String month = "10";
Итак, мы можем взять ваш оригинальный код и заменить его на
String newDate = date.replace("10", "October");
Теперь должно быть ясно, что вы НЕ ограничены только той частью строки между дефисами. Это ограничение применяется только к подстроке. Как только вы используете результат подстроки в замене, вы просто передаете ей строку. В частности, вы передаете "10"
, который дважды появляется в строке, поэтому он заменяет его дважды.
Если вы хотите попытаться сделать это, вы можете изменить свой исходный код, чтобы он выглядел как
String newDate = date.replace(date.subString(date.indexOf("-"), date.lastIndexOf("-")), "-October");
Это заменит "-10"
на "-October"
. Поскольку "-10"
встречается в строке только один раз, выполняется только одна замена.
Если у вас есть Map
, который отображает целые месяцы на имена, вы можете использовать его как
Map<String, String> months = new HashMap<>();
months.put("10", "October");
String month = date.subString(date.indexOf("-"), date.lastIndexOf("-"));
String newDate = date.replace(month, "-" + months.get(month.subString(1)));
Это строит "-October"
на лету и будет работать в течение других месяцев, при условии, что вы заполните ими карту. Но, как отметили другие, может быть более надежным использовать вместо этого встроенный в Java синтаксический анализ и форматирование даты.