2016-09-15 3 views
1

Я хотел бы вернуть элемент List, который я прокручиваю с циклом for-each, вне цикла.Возвращает элемент внутри каждого из них вне его в Java

Вот мой метод:

private List<Taxi> taxis = new ArrayList<Taxi>(); 
Taxi scheduleTaxi(){ 
    for (Taxi taxi : taxis){ 
     if (taxi.isFree()) { 
      return taxi; 
     } 
    } 
    return null; //I would like it to return taxi not null 
} 

Любые предложения? Спасибо

+1

Ваш вопрос не имеет смысла. Ваш код уже делает то, что вы хотите. Вы уже возвращаете первое бесплатное такси внутри цикла и возвращаете нулевое, если нет бесплатных такси. –

+2

Ну, у вас есть весь список «Такси», который вы хотите вернуть? – markspace

+0

Я сделал тест, и он всегда возвращает null, он не возвращает бесплатное такси – Takichiii

ответ

1

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

Назначьте Taxi это isFree() к ссылке и вернуться, что вне для петли, как это,

private List<Taxi> taxis = new ArrayList<Taxi>(); 
Taxi freeTaxi = null; 
Taxi scheduleTaxi(){ 
    for (Taxi taxi : taxis){ 
     if (taxi.isFree()) { 
      freeTaxi = taxi; 
      break; //since you already found what you want, no need to keep going. 
     } 
    } 
    return freeTaxi; 
} 
+0

большое спасибо! знаете ли вы, почему в моем коде он не всегда «возвращает null», даже если это последнее возвращение? и какой из кодов имеет лучшее качество? – Takichiii

+0

Вы можете только один раз вернуться из функции, в момент «вернуть такси»; что он вышел из функции, он пропустит каждую строку после нее. Однако, если этого не произойдет, оно будет продолжаться до конца функции или до тех пор, пока не встретит следующий оператор возврата. – kgdinesh

+0

Спасибо! поэтому я думаю, что ваш фрагмент лучше, потому что он содержит только один 'return' – Takichiii

0

Это выглядит нормально, если вопрос связан с «должен ли я вернуть нулевую ссылку ??», то это ОК.

если вы немного изменить название метода и добавить хороший Java документ, как>

public Taxi getAvaliableTaxi(){ 
    for (Taxi taxi : taxis){ 
     if (taxi.isFree()) { 
      return taxi; 
     } 
    } 
    return null; //I would like it to return taxi not null 
} 

тогда я могу видеть, что это может быть возможно, что никакие такси не имеющиеся или бесплатно, когда я вызовите метод .. так что null является defenitely действительным типом возврата Является ли моя ответственность как клиент вашего API для проверки возврата до того, как я прыгаю в нулевом такси ...

1

Если я правильно понял вопрос правильно, вы не спрашиваете, как возвращать внутри итерационного цикла , но стараются не возвращать null, если подходящее совпадение не найдено, правильно ...? Это имеет смысл, я полагаю; У меня были некоторые коллеги, которые по какой-то причине были против того, чтобы работать с нулем.

Один из подходов, которые вы можете предпринять, - это подход «дозорного значения», как однажды назвал его один из моих наставников (возможно, для него есть лучшее имя). В принципе, у вас есть один конкретный экземпляр Taxi, который полностью отражает отсутствие такси. В своем классе такси ...

public class Taxi { 
    public static final Taxi NO_TAXI = new Taxi(/*constructor params here*/); 

    // Insert the rest of your class here! 
} 

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

Итак, ваш оригинальный scheduleTaxi метод будет выглядеть примерно так:

private List<Taxi> taxis = new ArrayList<Taxi>(); 
Taxi scheduleTaxi(){ 
    for (Taxi taxi : taxis){ 
     if (taxi.isFree()) { 
      return taxi; 
     } 
    } 
    // No free taxi found! Return the no-taxi instance. 
    return Taxi.NO_TAXI; 
} 

Убедитесь, что вы включили, что этот метод будет возвращать NO_TAXI, если нет свободного такси не найдено, так что пользователи не будут путать!

Я лично предпочитаю просто работать с null. :)