2016-04-10 3 views
-5

Прямо сейчас у меня есть булева установки, как это:Нужна помощь выполнения истина/ложь булево, который включает в себя для цикла и условного

public boolean deleteItem(String p) { 
    for(int i = this.myList.size() - 1; i > -1; i--) { 
     if(this.myList.get(i) == p) { 
      this.myList.remove(i); 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

Я пытаюсь пройти через ArrayList и удалять строки р из списка массивов. Однако если строка p существует внутри arraylist, мне нужно удалить строку и вернуть true. Если этого не существует, я просто должен вернуть false. Я кодирую в eclipse прямо сейчас, и он говорит, что операторы return, которые у меня есть прямо сейчас, не считаются обязательным оператором return, который мне нужен. Как я могу исправить свой код, чтобы он имел оператор (ы) возврата в нужном месте?

+2

Удалите блок else и переместите 'return false;' вне цикла for. –

+2

Что сказал @John, а также использовать '.equals()' для сравнения строк (а не '=='). – Bohemian

+2

Используйте * отладчик *. Мы не ваш отладчик. Если вы пройдете через код, вы сразу увидите свою ошибку. – Andreas

ответ

0

У вас есть путь через ваш код, который ничего не возвращает. Если ваш список пуст, цикл не будет выполняться, и он не пройдет ни к чему. Также ваш цикл вернется, как только вы обработаете свой первый элемент с истинным или ложным.

Комментарий Джона является правильным.

«Удалить блок еще и двигаться return false; вне цикл.

1

Зачем изобретать колесо?

public boolean deleteItem(String p) { 
    return this.list.remove(p); 
} 
0

Ваша функция имеет ряд недостатков.

  1. Вы делаете контрольная проверка равенства, а не проверка равенства значений. Для выполнения проверки равенства значений всегда используйте метод «equals». Вы не получите ошибок компилятора для такого рода недостатков. нежелательный выход.
  2. Не все потоки управления в вашей функции имеют оператор возврата, даже если ваша сигнатура метода предлагает непрямой оператор возврата. Это приведет к ошибке компилятора, которую вы видите в коде.
  3. У вас есть несколько операторов возврата. Это не ошибка компилятора и ошибка времени выполнения. Однако с точки зрения хорошей практики программирования, это не лучшая идея иметь несколько операторов возврата. Вы можете сделать оператор возврата на основе флага в самом конце.
  4. Вы удаляете элементы из объекта коллекции, итерации через него. В зависимости от типа используемого объекта коллекции он может вызывать исключение ConcurrentModificationException во время выполнения. Вместо этого вам нужно использовать отказобезопасный итератор, если он доступен.

Я попытался исправить вашу программу. См., Если это имеет смысл:

public boolean deleteItem(String p) { 
    boolean itemFound = false; 
    //Assuming your myList object returns a fail safe iterator. 
    //If it returns a fail fast iterator instead, see the next option.  
    Iterator<String> iter = this.myList.iterator(); 
    while(iter.hasNext()){ 
     if(iter.next().equals(p)) { 
      iter.remove(); 
      itemFound=true; 
     } 
    } 
    return itemFound; 
} 

Вышеупомянутая программа будет работать, если итератор отказоустойчив. Например. если ваш объект myList имеет тип CopyOnWriteArrayList, его итератор будет отказоустойчив. Но если ваш объект myList имеет тип такой простой ArrayList, который возвращает быстрый итератор с ошибкой, вышеупомянутый метод даст вам CME.

Если ваш объект коллекции MyList представляет список типа, вы можете попробовать что-то же просто, как:

public boolean deleteItem(String p) { 
    //removeAll will return true if at least 1 element is removed 
    return this.myList.removeAll(Collections.singletonList(p)); 
} 

С другой стороны, если вы используете Java 8, вы можете сделать что-то вроде следующего:

public boolean deleteItem(String p) { 
    //removeIf will return true if at least 1 element is removed 
    return this.myList.removeIf(item -> item != null && item.equals(p)); 
} 

Надеюсь, вам это поможет.