我正在为Java中的每个循环工作。我正在使用它们来使我的对象的每一类都做“绘图”,但它需要大量的内存,所以我想把它切成两半,有没有办法为每个循环而不是完整的列表?< / p>
pattern = re.compile(r'thread/.*/*apple|thread/.*/*potato')
for link in g_data:
match = pattern.search(link.get("href"))
if match:
print(match.group())
我想:
for(Tile tile: tiles){
tile.draw();
}
是否有可能或者我只需要获得长度的瓷砖,当它到达数字时会破坏循环?
答案 0 :(得分:4)
由于您已明确表示您拥有ArrayList
,因此您可以使用subList
功能查看列表的前半部分
for(Tile tile: tiles.subList(0, tiles.size()/2){
tile.draw();
}
这使用foreach
循环,并且代码非常简洁易读。
因为子列表只是原始列表的一个视图,所以没有惩罚复制到新列表。
答案 1 :(得分:3)
嗯,总是有旧式的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++;
}
答案 2 :(得分:2)
我想只做一半&#34; tile&#34;并在需要时做另一半。
如果按照你的顺序执行两半无关紧要,你可以这样做:
int counter = 0;
for(Tile tile: tiles) {
if (counter++ % 2 == 0) {
tile.draw();
}
}
为另一半做counter++ %2 == 1
。
答案 3 :(得分:2)
哦,有几种方法可以做到。
<强> JAVA 强>
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);
你有两个分区的列表,你可以迭代它们!
答案 4 :(得分:0)
这里给出的答案对我来说已经很好了,但我在你的问题中注意到你想要一个for-each循环。因此,您可以使用流将列表减半:
List<Tile> halve =tiles.stream().limit(tiles.size()/2).collect(Collectors.toList());
for(Tile tile : halve)
{
}
这与其他答案的方法相同,只是风格选择