我经常在Java中使用for-each循环。我使用它们让我的对象的每个类都能够执行“绘图”操作,但这需要大量的内存,因此我想将其减半,有没有一种方法可以只对部分列表执行for-each循环?
for(Tile tile: tiles){
tile.draw();
}
我想要:
for(Tile tile: (half of)tiles){
tile.draw();
}
这是否可能,或者我只需要获取瓷砖的长度,当它达到一定数量时中断循环?
我经常在Java中使用for-each循环。我使用它们让我的对象的每个类都能够执行“绘图”操作,但这需要大量的内存,因此我想将其减半,有没有一种方法可以只对部分列表执行for-each循环?
for(Tile tile: tiles){
tile.draw();
}
我想要:
for(Tile tile: (half of)tiles){
tile.draw();
}
这是否可能,或者我只需要获取瓷砖的长度,当它达到一定数量时中断循环?
既然您已经明确使用了ArrayList
,您可以使用subList
函数来获取列表的前一半视图。
for(Tile tile: tiles.subList(0, tiles.size()/2){
tile.draw();
}
这里使用了 foreach
循环,代码简洁易读。
由于子列表只是原始列表的一个视图,所以没有复制到新列表的惩罚。
好的,那么就老式的 for
循环吧。假设 tiles
是 List<Tile>
的一个实例:
for(int i = 0; i < tiles.size() / 2; i++)
{
tiles.get(i).draw();
}
或者,如果您想保持迭代器顺序:
Iterator<Tile> iter = tiles.iterator();
int i = 0;
int halfway = tiles.size() / 2;
while(i < halfway)
{
Tile tile = iter.next();
tile.draw();
i++;
}
ArrayList
,因为如果它是一个LinkedList
,那么使用列表迭代器的操作就不等同于使用foreach循环。 - RealSkepticint counter = 0;
for(Tile tile: tiles) {
if (counter++ % 2 == 0) {
tile.draw();
}
}
对于另一半,请执行counter++ %2 == 1
。
final List<Tile> tiles = .... // create the list of Tile instances
//Be sure that tiles is not empty before to do that
final List<Tile> firstHalfSubList=tiles.subList(0, tiles.size()/2);
final List<Tile> secondHalfSubList=tiles.subList(tiles.size()/2, tiles.length());
注意到这两个半列表都是备用的,因此使它们不可变。
但我的最爱是使用Guava库。
GUAVA
import com.google.common.collect.Lists;
import com.google.common.math.IntMath;
import java.math.RoundingMode;
final List<Tile> tiles = .... // create the list of Tile instances
final int partitionSize = IntMath.divide(tile.size(), 2, RoundingMode.UP);
final List<List<Tile>> partitions = Lists.partition(tile, partitionSize);
你有一个包含两个分区的列表,可以对它们进行迭代!
这里给出的答案已经很好了,但我注意到你在问题中想要使用 for-each 循环。因此,你可以使用流来将列表分成两半:
List<Tile> halve =tiles.stream().limit(tiles.size()/2).collect(Collectors.toList());
for(Tile tile : halve)
{
}
这与其他答案相同的方法,只是一种风格选择的观点。