检查数组是不是已经完全填充了任何非默认值

Posted

技术标签:

【中文标题】检查数组是不是已经完全填充了任何非默认值【英文标题】:check if array is alrdeady FULLY filled with any non-default value检查数组是否已经完全填充了任何非默认值 【发布时间】:2022-01-14 14:44:43 【问题描述】:

我不确定是否可以检查,但我有一个问题 rn 我有一个数组

假设:int[] unmarkedSum = new int[100];

现在,当某个条件为真时,我在这个数组中放入一些东西,而不是在每次迭代中。但我知道一个事实是,由于我的算法的工作原理,在某些时候整个数组将被任何非 0 的正值填充。

我的问题是:有没有办法检查它何时已满?

就像我是这样开始的:

for(int i = 0; i < unmarkedSum.length; i++) 
    if(unmarkedSum[i] == 0 
        break; 
    
    else 
        // idk tbh 
    

【问题讨论】:

你可以与另一个线程共享这个数组,这样一个线程可以填充值,另一个线程可以同时检查数组。当第二个线程发现没有任何默认值(或0)时,它可以通知第一个线程(或主线程) 尚未使用线程,但仍然感谢该解决方案。 @VipulVerma 听起来太复杂了。 【参考方案1】:

我会简单地维护一个可变大小,以跟踪已将多少值写入数组。

例子:

        int size = 0;
        int[] array = new int[100];
        Random r = new Random();
        while(size < array.length)
            int index = r.nextInt(100);
            int val = r.nextInt(1000)+500;
            if (array[index] == 0)
              array[index] = val;
              size++;
            
        
        
        System.out.println(Arrays.toString(array));

【讨论】:

【参考方案2】:

Java 中,ints 的数组默认用零填充。您可以使用它来检查数组是否已满。例如,您可以创建一个检查 0 并在没有 0 时返回 true 的方法:

public static bool isArrayFilled(int[] array) 
    for(int i = array.length; i >= 0; i--)
        if(array[i] == 0) 
            return false;
        
     
     return true;

如果数组足够大且填写无序,可以使用advanced algorithms在数组中找到至少一个0值。

【讨论】:

这不起作用,但这不是你的坏事。忘了提到数组是随机填充的。所以它可以首先填充第 13 个条目,然后可能是第 74 个条目,依此类推,直到它完全填充任何非 0 的正数。 你所说的“完全填满”是什么意思?如果您的意思是数组的所有项目都不是零而不是那些方法应该起作用,您只需将数组 unmarkedSum 传递给这些方法:bool isFilled = isArrayFilled(unmarkedSum) 天啊,我搞混了。它确实有效^^ sry @EgZoShift 你试过我回答中的代码吗?【参考方案3】:

根据我之前的评论,您可以与另一个线程共享此数组,以便一个线程可以填充值,另一个线程可以同时检查数组。当第二个线程发现没有默认值(或0)时,它可以通知第一个线程(或主线程)。这是您可以做到的方法

import java.util.Arrays;
import java.util.Random;

public class CheckArray 

    public static void main(String[] args) throws InterruptedException 
        var arr = new int[50];

        Thread arrayChecker = new Thread(() -> 
            var isZeroPresent = false;
            while (true) 
                for (int index = 0; index < arr.length; index++) 
                    isZeroPresent = false;
                    if (arr[index] == 0) 
                        isZeroPresent = true;
                        break;
                    
                
                if (isZeroPresent == false) 

                    // if the for loop completed then control will come here
                    System.out.println("Array has been filled");
                    System.out.println(Arrays.toString(arr));
                    System.exit(0);
                
            
        );
        arrayChecker.start();
        
        // fill random values in the array
        // while another thread has been started
        Random random = new Random(); 
        while(true) 
            Thread.sleep(500);
            
            int index = random.nextInt(arr.length);
            arr[index] = random.nextInt(100);
            System.out.println(Arrays.toString(arr));
        
        
    



【讨论】:

直接使用线程是不合时宜的,忙碌的while (true)-loop 几乎不是一个好主意,Thread.sleep () 也不是。原理很不错,不过我建议使用CompletableFuture

以上是关于检查数组是不是已经完全填充了任何非默认值的主要内容,如果未能解决你的问题,请参考以下文章

使用数组键和默认值填充哈希

如果值为空,请检查“输入类型”,然后插入默认文本

Laravel 验证检查数组大小的最小值和最大值

具有默认值的打字稿固定数组

Angular textarea 不能用默认值填充

检查给定对象(引用或值类型)是不是等于其默认值