public class Solution {
public static void main(String[] args) {
ArrayList<String> strings = new ArrayList<String>();
strings.add("роза");
strings.add("лоза");
strings.add("лира");
strings = fix(strings);
for (String string : strings) {
System.out.println(string);
}
}
public static ArrayList<String> fix(ArrayList<String> strings) {
String buffer; // буферная строка
int i;
for (i = 0; i < strings.size(); i++) {
buffer = strings.get(i); // взятие строки для преобразования в char
ArrayList<Character> chars = new ArrayList<Character>(); // создание char листа
for (char c : buffer.toCharArray()) { // преобразование строки в char
chars.add(c); // добавление букв в лист chars
}
int j;
for (j = 0; j < chars.size(); j++) { // пробегаем по буквам char
if (chars.get(j) == 'р') { // если равно р
int k; // доп проверка
for (k = j; k < chars.size(); k++) {
if (chars.get(k) == 'л') break; // если и "р" и "л" - пропуск
else strings.remove(i); //****ошибка ,удаление элемента ,если не нашли "л"
}
}
else if (chars.get(j) == 'л') { // если равно л , то запускаем доп проверку
int k; // доп проверка
for (k = j; k < chars.size(); k++) {
if (chars.get(k) == 'р') break; // если и "р" и "л" - пропуск
else strings.add(i, buffer); // дублируем элемент ,если не нашли "р"
}
}
}
}
return strings;
}
}
Ошибка:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
Не понимаю, в чём ошибка.
Вот задача:
Метод fix должен:
2.1. удалять из списка строк все слова, содержащие букву "р"
2.2. удваивать все слова содержащие букву "л".
2.3. если слово содержит и букву "р" и букву "л", то оставить это слово без изменений.
2.4. с другими словами ничего не делать.
Не знаю полного условия, но думаю, что встроенные функции можно использовать, так как используешь ArrayList
.
public static ArrayList<String> fixFromMichael(ArrayList<String> strings) {
for(int i = 0; i < strings.size(); i++) {
if(strings.get(i).contains("р") && strings.get(i).contains("л")) {
continue;
}
if(strings.get(i).contains("р")) {
strings.remove(i);
}
if(strings.get(i).contains("л")) {
strings.add(strings.get(i));
i++;
}
}
return strings;
}
В массиве три слова. Удаляем одно из них. Остается два. После этого пытаемся удалить слово с индексом 2 и попадаем куда? Прямиком в IndexOutOfBoundsException потому что элемента с индексом 2 уже не существует.
После удаления строки надо уменьшать i на единицу и предельное значение в цикле т.е. изначально count = strings.size()
а после удаления count--; i--;
, т.к. индексы смещаются после удаления. Соответственно когда идет обращение ко 2 элементу списка его уже не существует.
Можно решить так:
public static void main( String[] args ){
ArrayList<String> data = getData();
fix( data );
System.out.println( data );
}
private static ArrayList<String> getData(){
return new ArrayList<>(Arrays.asList( "роза", "лоза", "лира" ));
}
private static void fix( ArrayList<String> data ){
String str;
for( int i = data.size()-1; i >= 0; i-- ){
str = data.get(i);
if(str.indexOf( 'р' )!=-1 && str.indexOf( 'л' )!=-1){
continue;
}
if(str.indexOf( 'р' )!=-1){
data.remove( i );
continue;
}
if(str.indexOf( 'л' )!=-1){
data.set(i,str+str);
}
}
}
Или такой вариант можно использовать без коррекции начального списка во время проверки слов, а только после проверки уже заменить его отредактированным списком:
public class Solution {
public static void main(String[] args) {
ArrayList<String> strings = new ArrayList<String>();
strings.add("роза");
strings.add("лоза");
strings.add("лира");
strings = fix(strings);
for (String string : strings) {
System.out.println(string);
}
}
public static ArrayList<String> fix(ArrayList<String> strings) {
ArrayList<String> stringsNew = new ArrayList<>();
String buffer; // буферная строка
int i;
for (i = 0; i < strings.size(); i++) {
buffer = strings.get(i); // взятие строки для преобразования в char
ArrayList<Character> chars = new ArrayList<Character>(); // создание char листа
for (char c : buffer.toCharArray()) { // преобразование строки в char
chars.add(c); // добавление букв в лист chars
}
int j;
for (j = 0; j < chars.size(); j++) { // пробегаем по буквам char
if (chars.get(j) == 'р') { // если равно р
int k; // доп проверка
for (k = j; k < chars.size(); k++) {
if (chars.get(k) == 'л') {
stringsNew.add(buffer);// если и "р" и "л" - добавим слово в новый лист
// и выйдем из цикла
break;
}
}
} else if (chars.get(j) == 'л') { // если равно л , то запускаем доп проверку
int k; // доп проверка
for (k = j; k < chars.size(); k++) {
if (chars.get(k) == 'р') {
stringsNew.add(buffer); // если и "р" и "л" - добавим слово в новый лист
// и выйдем из цикла
break;
}
if(k==chars.size()-1){
stringsNew.add(buffer);
stringsNew.add(buffer); // добавим в новый лист 2 эксемпляра слова
// дошли до конца слова и не нашли "р"
}
}
}
}
}
return stringsNew; // вернем в новый список
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
В флекс каталоге есть меню и товары, как закрепить меню в правом верхнем углу так, чтобы товары обтекали его слева и снизу? https://jsfiddlenet/4roj2ced/
Есть текст на странице, у него opacity стоит 0, и как только пользователь его увидит (к примеру прокрутит страницу) то у него должна стать opacity 1 с неким...
Не понимаю почему animation-iteration-count работает только для последней анимации?