如何将每个循环的Java切成两半?

时间:2015-07-26 19:18:17

标签: java loops

我正在为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();
}

是否有可能或者我只需要获得长度的瓷砖,当它到达数字时会破坏循环?

5 个答案:

答案 0 :(得分:4)

由于您已明确表示您拥有ArrayList,因此您可以使用subList功能查看列表的前半部分

for(Tile tile: tiles.subList(0, tiles.size()/2){
  tile.draw();
}

这使用foreach循环,并且代码非常简洁易读。

因为子列表只是原始列表的一个视图,所以没有惩罚复制到新列表。

答案 1 :(得分:3)

嗯,总是有旧式的for循环。假设tilesList<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)
{   
}

这与其他答案的方法相同,只是风格选择