【问题标题】: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 听起来太复杂了。

标签: java arrays loops


【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2017-12-11
    • 2017-10-23
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多