private static ArrayList<String> places(ArrayList<Road> roads) {
ArrayList<String> places = new ArrayList<String>(10); // tried setting minimum capacity
places.ensureCapacity(10); // tried setting minimum capacity
for (int i = 0; i < roads.size(); i++) {
String from = roads.get(i).getFrom();
String to = roads.get(i).getTo();
for (int j = 0; j < places.size(); j++) { // this is where things go wrong, it doesn't iterate because the "j < places.size()" condition isn't met
if ((places.get(i).equals(from))==false) {
places.add(from);
}
if ((places.get(i).equals(to))==false) {
places.add(to);
}
}
}
return places;
}
不知道为什么但是places-ArrayList没有设置初始容量,导致无法在以后必须迭代的地方(处理j变量的for循环)。 / p>
答案 0 :(得分:4)
最小容量与尺寸不同。设置容量只是列表的一个提示,它应该至少有这么多的存储空间以避免不必要的数组副本,但不影响大小,所以即使你有n个元素的容量,size()
可以更少,并且调用get(n-1)
可能会产生IndexOutOfBoundsException
。
要创建一个用null
填充的大小为n的列表,请尝试
List<String> myList = new ArrayList<String>(n);
for (int i = 0; i < n; ++i) { myList.add(null); }
答案 1 :(得分:2)
capacity属性只是为类提供了内部缓冲区维度的大小。它没有向列表添加任何值(顺便说一句,这些值会被添加?)所以列表仍然是空的。
容量的唯一影响是允许类在执行后期避免调整其缓冲区大小(以及相关的性能损失)。但这不是一个硬性限制。您可以像使用任何其他列表一样随意添加或添加更多元素。
答案 2 :(得分:0)
使用foreach
:
for(Road road : roads)
{
String from = road.getFrom();
String to = roads.getTo();
for(Places place: places)
{
if(!place.equals(from)) places.add(from);
if(!place.equals(to)) places.add(to);
}
}
答案 3 :(得分:0)
ArrayList.ensureCapacity()
分配足够的内存以容纳给定数量的条目。它实际上并没有将任何内容放入ArrayList
。
ArrayList.size()
计算实际条目的数量,而非当前容量。
在致电places.size()
以实际将任何内容放入places.add()
之前,您的循环会查看places
。在循环开始时调用places.size()
时,它会正确返回0,因为此时您尚未将任何内容放入places
。
另一点。您有一个名为places
的方法,在该方法中还有一个名为places
的局部变量。这是混乱的一个秘诀。您应该为其中一个使用不同的名称。