迭代一组的子集

时间:2013-06-18 22:56:06

标签: java for-loop iteration

我有一个oneHundredInactiveSynapses,我想在该集合中操纵100个inactiveSynapses中的随机21然后停止。我觉得应该有一个简单的方法来做到这一点,但我现在想不出任何事情。

for (Synapse inactiveSynapse : oneHundredInactiveSynapses) {
    // I want to call a method on the inactiveSynapse like
        inactiveSynapse.setActiveState(true);
        // but I only want to do this to 21 of the synapses. How can I do this?
}

其他要点:

  1. 将oneHundredInactiveSynapses放入数组不是一个选项
  2. 我不关心哪个21变得活跃

4 个答案:

答案 0 :(得分:1)

您可以复制Set,随机播放并获取前21个元素的子列表 -

List<Synapse> copy = new ArrayList<Synapse>(original);
Collections.shuffle(copy);
List<Synapse> sub = copy.subList(0, 21);
for(Synapse s : sub) { ... }

答案 1 :(得分:0)

Set转换为数组,然后访问数组中的21个随机元素。你的问题说集合只有100个元素,所以不应该太贵。如果您无法选择具体的Set实现或更改填充集合的代码,那么沿着这些行的东西是唯一的选择。

如果你可以改变填充集合的代码,你当然可以在添加21个元素后停止它。如果您可以注入自己的Set实现,则可以使用提供随机排序的实现,并仅迭代前21个元素。

答案 2 :(得分:0)

为了使它有点随机,你可以随机选择一个直到你达到21点。注意如果你只剩下足够的21到达你必须解雇所有这些,所以有一点偏向于最后是突触。

    int chosen = 0;
    int left = oneHundredInactiveSynapses.size();
    java.util.Random rand = new java.util.Random();
    for (Synapse inactiveSynapse : oneHundredInactiveSynapses) {
        if(left-chosen>21) inactiveSynapse.setActiveState(true);
        else{
          if(rand.nextBoolean()){
            inactiveSynapse.setActiveState(true);
            chosen++;
            if(chosen==21) break;
          }
        }
        left--;
   }

但是,如果你真的不关心随机性,那么只需使用一个计数来选择前21个。

   int count = 0;
   for(Synapse inactiveSynapse : oneHundredInactiveSynapses){
     if(count==21) break;
     inactiveSynapse.setActiveState(true);
     count++;

   }

答案 3 :(得分:0)

如果您对第21页没问题,可以这样做:

int count = 0
for (Synapse inactiveSynapse : oneHundredInactiveSynapses) {
    if(count < 21){
        inactiveSynapse.setActiveState(true);  
        count++;        
    }else{
         break; 
    }

}

如果你想随机,你可以这样做:

java.util.Random rand = new java.util.Random();
    int count = 0
    for (Synapse inactiveSynapse : oneHundredInactiveSynapses) {
        if(rand.nextInt(100) % 2){
            next;
        }
        if(count < 21){
            inactiveSynapse.setActiveState(true); 
             count++;         
        }else{
           break; 
        }

如果随机数是偶数,这将转到下一个元素,直到你到达21,这将破坏。     }