как это для цикла перевести на английский? - PullRequest
0 голосов
/ 09 марта 2019

Так что в основном я получил этот код от своего профессора, но я никогда не видел, чтобы кто-нибудь написал цикл for, подобный этому. Я даже не знаю, как начать читать? Может кто-нибудь сказать мне, как вы сначала прочитаете это по-английски, а затем, как лучше всего использовать это в цикле for? также не думаю, что эта информация была необходима, но просто, мы работаем над связанными списками в Java.

Заранее спасибо

    public void delete(Object el) {    // find and remove el;  
    if (head != null)              // if non-empty list;
         if (el.equals(head.info)) // if head needs to be removed;
              head = head.next;
         else {
              SLLNode pred = head, tmp = head.next;
              for ( ; tmp != null && !(tmp.info.equals(el));
                      pred = pred.next, tmp = tmp.next);
              if (tmp != null)     // if found
                    pred.next = tmp.next;
         }
}

Ответы [ 3 ]

2 голосов
/ 09 марта 2019
for(x;y;z) { ...; }

эквивалентно

x;
while(y) {
  ...;
  z;
}

Так что

  for ( ; tmp != null && !(tmp.info.equals(el));
          pred = pred.next, tmp = tmp.next);

эквивалентно:

while(tmp != null && !(tmp.info.equals(el))) {
  pred = pred.next, tmp = tmp.next;
}

В английском это будет что-то вроде

Пока мы не найдем искомый элемент или конец списка: обновите предшествующий и текущий элемент до соответствующих им следующих элементов

1 голос
/ 09 марта 2019

Java для цикла имеет вид:

for (initialization; termination; increment) {
    statement(s);
}

Ваш пример кода:

for ( ; tmp != null && !(tmp.info.equals(el));
        pred = pred.next, tmp = tmp.next);

Если мы разберем его, вы можете увидеть там:

  • нет инициализация шаг
  • две части до окончания
  • два (разделенных запятыми) оператора с шагом step

На грубом английском:

  • продолжайте цикл до тех пор, пока tmp не станет null или tmp не будет соответствовать элементу, который нужно удалить, т.е. перебирайте список, пока не дойдете до конца или не найдете совпадение
  • каждый раз в цикле, увеличивать pred и tmp, указывая их на следующий элемент
0 голосов
/ 09 марта 2019
Цикл

A for состоит из четырех частей: выражение инициализации , выражение завершения , выражение приращения и корпус .

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

Итак, чтобы разобрать это на части:

  • Выражение инициализации пусто (ничего до первого ;)
  • Выражение завершения равно tmp != null && !(tmp.info.equals(el)
  • Выражение приращения равно pred = pred.next, tmp = tmp.next
  • Тело также пусто (после закрывающего ) выражения for следующий оператор просто ;

На простом английском языке:

Пока tmp не является null, но tmp.info не является нашим желаемым элементом el, продолжайте перемещаться pred и tmp, чтобы указывать на элементы-преемники в связанном списке.

Условием завершения этого цикла является то, что либо tmp равно null (если el вообще не был элементом списка), либо pred указывает на узел до узел, который имеет el в качестве значения, а tmp указывает на узел, который имеет el в качестве значения.

Обратите внимание, что этот код написан в очень кратком стиле. Этот стиль был распространен для низкоуровневого кода 20+ лет назад; в настоящее время, когда я вижу такой код, это заставляет меня думать, что он был написан старым таймером.

Я бы, вероятно, вместо этого написал бы такой же метод:

public void delete(Object item) {
    if (head == null) {
        // The list is empty; we have no work to do.
        return;
    }
    if (head.info.equals(item)) {
        // We're deleting the head of the list; just update our head reference.
        head = head.next;
        return;
    }
    SLLNode previous = head;
    SLLNode current = head.next;
    while (current != null) {
        if (current.info.equals(item)) {
            // Update the list to skip the current node, then we're done.
            previous.next = current.next;
            return;
        }
        // Move to the next node in the list.
        previous = current;
        current = current.next;
    }
    // If we reached this point, the item was not found in this list.
    // There's nothing to do, so we're done anyway.
}
...