为什么我的 for 循环的这一部分不起作用?

问题描述 投票:0回答:1

我的代码中有这个 for 循环,它使用一个充满随机生成的数字的数组,如下所示

for (int i = 0; EndResult == true; i++) {   
    count = count + 1;
    
    if (count == 1) {//adds size of arraylist to arraycount
        ArrayCount.add(CardReduce.size());
    }
    
    for (int a = 0; a < CardReduce.size(); a++) {//replaces values by same value - 1
        int val = CardReduce.get(a);
        CardReduce.set(a, (val -1));
    }
    
    for (int b = 0; b < CardReduce.size(); b++) {//removes all elements with value of 0
        CardReduce.remove(Integer.valueOf(0));
    } 
    
    if (count == CardReduce.size()) {//when count is equal to size of CardReduce executes 
        CardReduce.addAll(ArrayCount);
        Collections.sort(CardReduce);
        System.out.println(CardReduce);
        ArrayCount.clear();
        count = 0;
    }
    
    if (count == 8) {
        EndResult = false;
    }
}

我的问题是 if 循环,其中 count 等于 CardReduce 大小,除了这部分之外的所有其他代码都有效。因为这部分代码应该在计数等于数组列表大小时执行,但由于某种原因它没有执行。因为这个 for 循环应该做的是将原始数组的大小存储在单独的数组列表中。对于每个循环,随机生成的数组的元素从该数字中减去一,并在每次完成时增加计数,删除任何零(如果存在)。一旦计数等于 CardReduce 数组的大小,添加存储的数组的大小,对该数组进行排序并清除存储的大小,以便在下一个周期添加新的数组。

例如,假设我在第一个周期结束时在数组中获得的随机数是 2 2 7 9 25,现在应该是 1 1 6 8 24 5,但我得到的唯一值是 4 5 6 22正确的结果是 5,因为这是原始数组中的元素数量,但其余的完全错误。通过测试,我非常确定导致问题的代码是 if 循环,其中 count 等于 CardReduce 大小。

编辑:所以这是完整的代码,但简化为必要的部分

import java.util.*;

public class test {
    
    public static void main(String[] args) {
    
        int[] EndResult = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        int[] RandomCards = new int[45];
        int Size = 0;
        int total = 45;
        int count = 0;
    
        for(int i = 0; total > 0; i++) {
            int random = (int) (Math.random() * total) + 1;
            total -= random;
            RandomCards[i] = random;
            Size++;
            Arrays.sort(RandomCards);
            }
        
        System.out.println("Cards Seperated in Stacks: ");
        for (int i = 0; i < RandomCards.length; i++) {
            
            if (RandomCards[i] > 0) {
                System.out.print(RandomCards[i] + " ");
            }
        }
        
        System.out.println(" ");
        System.out.println("==========================");
        System.out.println("Game Start: ");
        
        ArrayList<Integer> CardReduce = new ArrayList<Integer>();
        ArrayList<Integer> ArrayCount = new ArrayList<Integer>();
        Boolean FinalResult = true;
        count = 0;
        
        for(int i = 0; i < RandomCards.length; i++) {
            
            if (RandomCards[i] > 0) {
                CardReduce.add(RandomCards[i]);
            }
        }
        
        for (int i = 0; FinalResult == true; i++) {   
            count = count + 1;
            
            if (count == 1) {//adds size of arraylist to arraycount
                ArrayCount.add(CardReduce.size());
            }
            
            for (int a = 0; a < CardReduce.size(); a++) {//replaces values by same value - 1
                int val = CardReduce.get(a);
                CardReduce.set(a, (val -1));
            }
            
            for (int b = 0; b < CardReduce.size(); b++) {//removes all elements with value of 0
                CardReduce.remove(Integer.valueOf(0));
            } 
            
            if (count == CardReduce.size()) {//when count is equal to size of CardReduce executes 
                CardReduce.addAll(ArrayCount);
                Collections.sort(CardReduce);
                System.out.println(CardReduce);
                ArrayCount.clear();
                count = 0;
            }
            
            if (count == 8) {
                FinalResult = false;
            }
        }
    }
}
java loops for-loop if-statement conditional-statements
1个回答
0
投票

主要问题似乎是在迭代时从

CardReduce
中删除元素,这可能会导致某些元素被跳过。要解决此问题,请在递减每个元素后尝试使用
removeIf()

for (int a = 0; a < CardReduce.size(); a++) {
    CardReduce.set(a, CardReduce.get(a) - 1);
}
CardReduce.removeIf(val -> val == 0); // removes values that are 0

此外,在修改之前使用

originalSize
存储
CardReduce
的大小,因此条件
count == CardReduce.size()
可以正常工作:

int originalSize = CardReduce.size();
if (count == originalSize) { 
    CardReduce.addAll(ArrayCount);
    Collections.sort(CardReduce);
    ArrayCount.clear();
    count = 0;
}

最后,你可以使用

while (FinalResult)
代替
for
,让循环条件更清晰。

© www.soinside.com 2019 - 2024. All rights reserved.