2013-04-07 2 views
-1

Запишите способ removeShorterStrings, который принимает в качестве параметра ArrayList<String> и удаляет из каждой последующей пары значений более короткую строку в паре.Удаление более коротких строк не работает

Например, предположим, что ArrayList называется list содержит следующие значения: {"four", "score", "and", "seven", "years", "ago"}

В первой паре, "four" и "score", тем короче строка "four".
Во второй паре, "and" и "seven", более короткая строка "and".
В третьей паре, "years" и "ago", более короткая строка "ago".

Следовательно, вызов: removeShorterStrings(list); должен удалить эти короткие строки, оставив список следующим образом: {"score", "seven", "years"}.

Если есть галстук (обе строки имеют одинаковую длину), ваш метод должен удалить первую строку в паре. Если в списке есть нечетное число строк, окончательное значение должно быть сохранено в списке.

public void removeShorterStrings(ArrayList <String> a){ 
    
    for(int i=0;i<a.size()-1;i+=2){ 
        String word=a.get(i); 
        String word2=a.get(i+1); 
         
        if(a.size()%2==0 && word.length()<word2.length()){ 
           a.remove(i); 
      if(word.length()==word2.length()){ 
       a.remove(i); 
      } 
        } 
    } 
} 

для ["four", "score", "and", "seven", "years", "ago"].

Мой код дает мне [score, and, seven, years, ago] вместо [score, seven, years].

В чем проблема?

+0

«Советами, чтобы сделать хорошо в Java» не помещается на этом сайте. Либо чтение Intro To Programming, либо Intro To Java book (Google для хорошего) или [принятие] (https://www.edx.org/) [a] (https://www.udacity.com/) [ конечно] (https://www.coursera.org/), который объясняет, что все может помочь. Вы также можете найти книгу Логического мышления или курс где-нибудь. Чтение базовых программных блогов также может помочь. – Dukeling

ответ

1

Ваш тест a.size()%2==0 выполняется для каждой пары, это не требуется. Просто удалите его.

3

Поскольку вы уже удаляете свои предметы из списка, вам нужно только увеличить его на единицу. А поскольку вы сравниваете пары, вам нужно удалить один из них в вашем цикле.

Это один производит [счет, семь, лет]

public void removeShorterStrings(ArrayList <String> a){ 

    for(int i=0;i<a.size()-1;i++){ 
     String word=a.get(i); 
     String word2=a.get(i+1); 

     if(word.length()<word2.length()){ 
      a.remove(i);   
     } else { 
      a.remove(i+1) 
     } 
    } 
} 
+0

@baraky yes Я запустил его в groovyConsole 'removeShorterStrings ([" four "," score "," and "," seven "," years "," ago "])' –

+0

Ваше тело цикла может быть выражено в одной строке. Вы можете рассмотреть отредактированное множество избыточного кода, особенно объявление локальной переменной для слов. – Bohemian

+0

@Bohemian Я знаю, что это можно оптимизировать, я хотел показать, какие изменения были необходимы для исходного кода, чтобы заставить его работать, а не строить оптимальное решение. –

1

Ваша проблема заключается в том, что вы удалите элементы из списка, но продолжают использовать старые индексы. Самый простой способ обойти это путем обхода вашего массива в обратном направлении:

public void removeShorterStrings(ArrayList <String> a){ 

    for(int i=a.size()/2-1; i>=0; i--){ 
     String word=a.get(2*i); 
     String word2=a.get(2*i+1); 

     if(word.length()<=word2.length()){ 
      a.remove(2*i); 
     } else { 
      a.remove(2*i+1); 
     } 
    } 
} 
1

Вы не можете изменить список внутри для цикла итерации по элементам списка. (если вы не обрабатываете индекс после удаления элементов)

Допустим, вы удалили первый элемент (i = 0), затем второй элемент (индекс 1) станет первым и так далее. Теперь, когда вы увеличиваете i, вы попадаете во вторую пару, которая первоначально была четвертой и пятой (вместо третьего и четвертого).

Попытайтесь понять это первым.

Вот почему вы не можете изменить список при переборе над ним (если вы не используете Iterator)

другой thing- вам не нужно проверить, если a.size()%2==0. Есть много других способов, которыми вы можете это сделать.

основные вопросы
+0

Если вы не двигаетесь назад :) –

+0

Да! Thanx Я добавлю это :) – BobTheBuilder

+0

, если вы измените 'i + = 2' на' ++ i' и добавьте 'else {++ i; } 'вы можете сделать' a.remove (i) '. – Aubin

0
ухода

Возьмите у вас есть здесь

Первый

for(int i=0;i<a.size()-1;i+=2){ 

удалить элементы из динамического массива (ArrayList), и вы имеете дело с ним, как будто он статичен один приращением I каждой итерации по 2, в то время как вы удаляете каждый элемент итерации 1, чтобы индексы элементов уменьшались на 2. , т. Е. На первой итерации ваш i = 0 и вы удаляете «четыре» из a, поэтому теперь содержит [«score», «and», «seven» "," лет "," назад "], то вы идете на второй цикл с i = 2, который делает a.get (i) возвращать« семь »не« и »вам! , что очевидно, потому что теперь вы удалили элемент 1 и esch теперь имеют индекс = oldIndex-1.

Второй

if(a.size()%2==0 && word.length()<word2.length()){ 
     a.remove(i); 
     if(word.length()==word2.length()){ 
      a.remove(i); 
     } 
    } 

вы кладете совершенно неправильные условия в этом случае блок и это на самом деле основная работа, которую вы делаете здесь, который никогда не будет сделано правильно, теперь из-за этих условий.

1- a.size()%2==0 будет оценивать true только в первом цикле, потому что размер четный, после первого цикла у вас будет этот размер даже на 1, чтобы стать нечетным.

2- word.length()<word2.length() это даст ложное значение, если два слова равны по длине !! на самом деле вы никогда не получите это условие if(word.length()==word2.length()){ a.remove(i); }

правильный код должен быть

for(int i=0;i<a.size()-1;i++){ 
     String word=a.get(i); 
     String word2=a.get(i+1); 

     if(word.length()<=word2.length()){ 
      a.remove(i); 
     } 
     else 
      a.remove(i+1); 
} 
Смежные вопросы