Учитывая некоторые List<T> foo
, циклы foreach, например:
for(T item : foo){
// body
}
, являются всего лишь сокращенным синтаксисом для этой идиомы:
Iterator<T> iter = foo.iterator();
while(iter.hasNext()){
T item = iter.next();
// body
}
Чтобы проверить, что вlist, вы вызываете iter.hasNext()
, чтобы получить следующий элемент, вы вызываете iter.next()
.
Чтобы просмотреть два списка, нужно сохранить около 2 итераторов, проверить, что оба итератора имеют больше элементов, и затем извлечь теэлементы.Мы можем устранить некоторые граничные условия в списках разной длины, понимая, что списки разной длины не могут содержать одни и те же элементы (поскольку в одном списке больше, чем в другом).
Из вашего описания это звучит так, как будто Car
содержитсвойство List<String> parts;
, поэтому мы можем сформулировать решение следующим образом:
// different sizes, can't be equal
if(this.parts.size() != other.parts.size()){
return false;
}
// get iterators
Iterator<String> left = this.parts.iterator();
Iterator<String> right = other.parts.iterator();
// safe to only check `left` because the lists are the same size
while(left.hasNext()){
// check if left part is equal to the right part
if(!left.next().equals(right.next())){
// values are different, know at this
// point they're not equal
return false;
}
}
// at this point, have exactly the same values
// in the same order.
return true;
Что касается вашего метода transferContents
, у вас есть правильная идея, но вы не можете перебрать Car
, вынужно перебрать List<String> parts
.Чтобы удалить отдельные детали, вы можете использовать метод remove()
, называемый как метод add
, или удалить все элементы, вы можете вызвать clear()
Соединяя это вместе:
for (String part : c.parts) {
this.parts.add(part);
}
c.parts.clear();