Посмотрите на это следующим образом: вы не должны рассчитывать, как часто вы находите второй строку в первой строки, потому что вы всегда должны проверить если вы нашли его или нет , Таким образом, чтобы избежать всех видов условий или операторов, рассмотрите возможность использования firstString.split(secondString)
.
split(someString)
вернет вам массив оставшихся подстроки, как только вы «сплит» базовая строка каждый раз, когда он находит свою подстроку:
String first = "bababa";
String second = "a";
String[] substrings = first.split(second);
Теперь substrings
будет выглядеть следующим образом: ["b", "b", b"]
, потому что каждый a
был удалены, а остальные помещены в отдельные строки.
Далее вы должны проверить размер массива, и вы увидите, как часто ваша ячейка first
была разделена.
int count = substrings.length; // 3
Однако, это не конец, потому что мы все еще имеем следующий случай:
String first = "bababaa";
С выше решения вы получите массив размером 3: ["b", "b", "b"]
. Последнее вхождение a
будет только удалено, не оставляя подстроки позади (даже не пустой ''
).
Таким образом, вы можете воспользоваться другим (немного отличается) split()
:
first.split(second, limit);
limit
Где максимальное число вхождений метод пытается найти. Итак, как часто вы можете найти свою вторую строку в первой? Как много писем первая строка имеет: int limit = first.length
first.split(second, first.length); // will produce [b, b, b, , ]
Можете ли вы увидеть, что происходит? в конце есть две пустые строки, где есть два a
.Вы получаете массив подстрок для всего, что находится до или после появление второй строки.
Естественно, когда вы разделите строку ba
, вы получите ["b", ]
, поэтому 2 подстроки. Но вы не заботитесь о b
только «запятыми» посередине (за каждые a
a ,
).
first.split(second, first.length).length -1; // that's how many commas there are, and thats how many second strings there are
EDIT
(спасибо @ saka1029!) Таким образом, метод "раскол" по-прежнему пропускает кое-что, когда first="aaa"
и second="aa"
, потому что он считает только 1 не 2 вхождений.
Чтобы исправить это, я подумал о том, чтобы перебрать всю первую строку и проверить только на первое вхождение, а затем удалить первую букву и продолжить (, так как OP уже принял другой ответ, я просто отправлю свой код):
String first = "ZZZ";
String second = "ZZ";
int counter = 0; // counts the number of occurrences
int n = first.length(); // needs to be fixed, because we'll change the length of the first string in the loop
for(int i = 0; i < n; i++){ // check the first string letter by letter
String[] split = first.split(second, 2); // we want one substring and the rest (2 in total) like: ['', 'Z'] when we cut off the first 'ZZ'
counter += split.length - 1; // now add the number of occurrences (which will be either 0 or 1 in our case)
first = first.substring(1); // cut off the first letter of the first string and continue
}
System.out.println("counter = " + counter); // now we should get 3 for 'ZZZ'
У вашего кода много проблем. Кроме того, вы не выполняете задание. Если это необходимо для получения аргументов командной строки, вы должны использовать массив 'args'. –
Я знаю, но я хочу сначала проверить его с помощью более простого кода –
Когда 'a =" ZZZ "и' b = "ZZ" ', он должен вернуть 1 или 2? – saka1029