2013-06-18 134 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