我有两个问题。我这里有一个 ArrayList 类型的对象,对于这种情况,我们称之为 "Car"

我做了两个:

Car car1 = new Car();
Car car2 = new Car();

我有一个功能可以将项目添加到这些 Car 对象中:
car1.addPart("Front Wheels");
car1.addPart("Rear Wheels");
car1.addPart("Rear View Mirror");

car2.addPart("Rims");
car2.addPart("Steering Wheel");
car2.addPart("Bumper");

我需要一个名为 sameContents() 的函数,我可以在 car1 上调用它:
car1.sameContents(car2);

它传入一个 ArrayList 类型的对象并用 car1 检查它以查看它们是否具有相同的内容和相同的顺序。
public boolean sameContents(Car c) {
    ArrayList<String> other_car = c; // error: Type mismatch:
                                    // cannot convert from Car to ArrayList<String>

    for (String c : this.parts) {
        System.out.println(c);
        for(String oc : other_car) {
             // stuff
        }
    }
}

我似乎对这个有各种各样的问题。我无法在 foreach 循环中使用 other_car 变量。

第二个需要做的是 transferContents

它被称为:
car1.transferContents(car2);

它将 car2 中的项目转移到 car1 中,然后将 car2 留空。我似乎无法让 ArrayList 在 foreach 循环中再次工作,这正是我认为我需要的。
 public void transfer(Car c) {
     // code for transfer method.
     // this.parts is the arraylist of car parts
     for (Car c: c) {
    this.parts.add(c);
      }
    // not sure how to set car2 to empty...
 }

最佳答案

给定一些List<T> foo,foreach循环,例如:

for(T item : foo){
    // body
}

只是该惯用语的简写语法:
Iterator<T> iter = foo.iterator();
while(iter.hasNext()){
    T item = iter.next();
    // body
}

要检查列表中是否还有其他项目,请调用iter.hasNext(),要检索下一个项目,请调用iter.next()

通过保留两个迭代器,检查两个迭代器是否包含更多元素,然后检索这些元素,可以遍历两个列表。通过意识到不同长度的列表不能包含相同的元素(因为一个列表比另一个列表具有更多的元素),我们可以消除不同长度列表上的某些边界条件。

根据您的描述,听起来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();

10-05 22:54
查看更多