2013-06-18 133 views
0

我有一套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变得活跃
+1

你其实是指随机的,还是你的意思是你不关心哪个21? –

+0

我不在乎哪个21. –

+0

@LouisWasserman两件非常不同的事情...... –

回答

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++; 

    } 
0

转换的Set到一个数组,然后访问数组中的21个随机元素。你的问题说该套件只有100个元件,所以不应该太昂贵。如果你不能选择具体的Set实现或者改变填充该集合的代码,那么沿着这些线是唯一的选择。

如果你可以改变填充该集合的代码,你当然可以在它添加了21个元素后停下来。如果你可以注入你自己的Set实现,你可以有一个实现提供一个随机排序,并且只遍历前21个元素。

+0

这可能会在处理大量数据时产生不利影响; 'Set'通常可以更有效。这就是说,这是一个足够好的解决方案,作为概念验证。 –

+0

另外,把它变成一个数组不是一个选项。 –

+0

@ 628496也许你应该将它编辑到你的Q中;这是一个相当的备用练习。 –

1

可以使Set,洗牌的副本,并获得子列表第21种元素 -

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

不是一个好主意,如果原始列表很大 –

+0

恕我直言,一百不被认为是巨大的。我曾经想过,但OP已经明确提到了100和21中的100个。 –

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,这将打破。 }

+0

您应该使用'rand.nextBoolean'而不是创建一个int并检查它是否是偶数。 – selig

+0

我想这是另一种方式。无论如何,它将具有相同的运行时间。 – BlackHatSamurai

+0

如果该随机生成器生成100个奇数,它将不会激活任何突触!有更好的方法来做到这一点。 – povman