Java 在集合的子集上迭代
我有一组100个活跃的突触,我想随机操纵其中100个不活跃的突触中的21个,然后停止。我觉得应该有一个简单的方法来做到这一点,但我现在想不出任何事情Java 在集合的子集上迭代,java,for-loop,iteration,Java,For Loop,Iteration,我有一组100个活跃的突触,我想随机操纵其中100个不活跃的突触中的21个,然后停止。我觉得应该有一个简单的方法来做到这一点,但我现在想不出任何事情 for (Synapse inactiveSynapse : oneHundredInactiveSynapses) { // I want to call a method on the inactiveSynapse like inactiveSynapse.setActiveState(true); /
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?
}
其他要点:
将
集合
转换为数组,然后访问数组中的21个随机元素。你的问题是,这个集合只有100个元素,所以不应该太贵。如果您无法选择具体的集合
实现或更改填充集合的代码,那么沿着这些线的内容是唯一的选项
如果您可以更改填充集合的代码,那么您当然可以让它在添加21个元素后停止。如果您可以注入自己的
Set
实现,那么您可以拥有一个提供随机排序的实现,并且只迭代前21个元素 为了让它变得有点随机,你可以随机选择发射,直到你达到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++;
}
您可以复制
集合
,洗牌并获得前21个元素的子列表-
List<Synapse> copy = new ArrayList<Synapse>(original);
Collections.shuffle(copy);
List<Synapse> sub = copy.subList(0, 21);
for(Synapse s : sub) { ... }
列表副本=新的ArrayList(原件);
收藏。洗牌(复制);
列表子列表=复制子列表(0,21);
对于(Synapse s:sub){…}
如果您对前21项没问题,您可以:
int count = 0
for (Synapse inactiveSynapse : oneHundredInactiveSynapses) {
if(count < 21){
inactiveSynapse.setActiveState(true);
count++;
}else{
break;
}
}
int count=0
用于(突触不活动突触:100个活跃突触){
如果(计数<21){
setActiveState(true);
计数++;
}否则{
打破
}
}
如果您想要随机,您可以:
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;
}
java.util.Random rand=new java.util.Random();
整数计数=0
用于(突触不活动突触:100个活跃突触){
如果(兰特耐克斯汀(100)%2){
下一个
}
如果(计数<21){
setActiveState(true);
计数++;
}否则{
打破
}
如果随机数为偶数,则这将转到下一个元素,直到达到21,这将中断。
}你的意思是随机的,还是说你不在乎哪21个?我不在乎哪21个。@LouisWasserman两个完全不同的东西……只要抓住前21个元素就行了。将
for
循环与计数高达21的计数器一起使用。出于兴趣,为什么不能创建收藏的浅数组/列表副本?这不会占用太多内存,在处理大量数据时会产生不利影响<代码>设置可以而且通常效率更高。也就是说,作为概念验证,这是一个足够好的解决方案。此外,将其放入数组不是一个选项。@628496也许您应该将其编辑到您的Q;这是一个很好的备用实践。你应该使用rand.nextBoolean
而不是创建一个int并检查它是否为偶数。我想这是另一种方法。不管怎样,它都将有相同的运行时间。如果随机生成器生成100个奇数,它将不会激活任何突触!有更好的方法可以做到这一点。嗯,一百美元不算多。我已经考虑过了,但OP明确提到了100分之100和21分之100。