我有两个问题。我这里有一个 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();