Правильно ли я пишу этот метод? - PullRequest
0 голосов
/ 31 января 2011

У меня есть ArrayList с именем conveyorBelt, в котором хранятся заказы, которые были собраны и размещены на конвейерной ленте. У меня есть еще один ArrayList, называемый readyCollected, который содержит список заказов, которые могут быть получены клиентом.

Что я пытаюсь сделать с помощью созданного мною метода, так это то, что при вводе ordNum возвращается значение true, если заказ готов к приему клиентом (таким образом, удаляя полученный заказ из readyCollected) , Если заказ еще не выбран, он возвращает ложь.

Мне было интересно, это правильный способ написать метод ...

  public boolean collectedOrder(int ordNum)
  {
      int index = 0;
      Basket b = new Basket(index);
      if(conveyorBelt.isEmpty()) {
          return false;
      }
      else {
          readyCollected.remove(b);
          return true;
      }
  }

Ответы [ 4 ]

1 голос
/ 01 февраля 2011

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

Вместо этого я быпредложите использовать Map, который связывает номера заказов с конкретным заказом.Это более естественно кодирует то, что вы хотите - каждый номер заказа является ключом, связанным с заказом.Map с, и в особенности HashMap с, имеют очень быстрый поиск (ожидаемое постоянное время) и используют (примерно) одинаковое количество места независимо от количества ключей.Более того, время для вставки или удаления элемента из HashMap ожидается постоянным, что очень быстро.

Что касается вашего конкретного кода, я согласен с Брайаном Агнью в этом, который вы, вероятно, захотитенапишите для него несколько модульных тестов и выясните, почему вы не используете параметр ordNUm.Тем не менее, я бы предложил переделать систему, чтобы использовать HashMap вместо ArrayList перед этим;экономия времени и сложности кода действительно окупятся.

1 голос
/ 01 февраля 2011

Я немного запутался, поскольку вы вообще не используете ordNum.

Если вы хотите подтвердить работу своего кода и в целом повысить надежность написанного, вам следует проверить модульное тестирование и доступные для этого фреймворки Java.

0 голосов
/ 01 февраля 2011

Как уже указывалось, вам, скорее всего, нужно использовать ordNum.

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

Как общий указатель (который может или не может быть применим в этом случае) вы должны убедиться, что ваш код имеет дело с крайними случаями и неправильными значениями.Поэтому, возможно, вы захотите пометить что-то не так, если, например, readyCollected.remove(b); возвращает false, поскольку это означает, что b не было в списке для удаления.

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

0 голосов
/ 01 февраля 2011

На основании вашего описания, почему этого недостаточно:

  public boolean collectedOrder(int ordNum)   {         
      return (readyCollected.remove(ordNum) != null);
  }

Почему даже необходимо проверять конвейерный ArrayList?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...