我的代码中有这个 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;
}
}
}
}
主要问题似乎是在迭代时从
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
,让循环条件更清晰。