Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在集合的子集上迭代_Java_For Loop_Iteration - Fatal编程技术网

Java 在集合的子集上迭代

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); /

我有一组100个活跃的突触,我想随机操纵其中100个不活跃的突触中的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?
}
其他要点:

  • 将100个活性突触组成一个数组不是一个选项
  • 我不在乎哪个21变得活跃

  • 集合
    转换为数组,然后访问数组中的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。