如何在 Java 中获取数组中最后一个不为零的数字

How to obtain the last number different to zero in an array in Java

例如我有这个数组:

double array1[] = {2.3, 5.0, 4.7, 8.2, 1.8, 9.0, 0, 0, 0, 0, 0, 0};

我想找到数组的最后一个不为0的数字。在这种情况下,我的输出应该是:9.0

我的代码是:

double array1[] = {2.3, 5.0, 4.7, 8.2, 1.8, 9.0, 0, 0, 0, 0, 0, 0};
double array2[] = array1.length;
double num;

for (int i = 0; i < array1.length; i++){
    array2[i] = array1[i];
    if(array2 != 0){
        num = array[i-1];
    }
} 

但是没用。

我需要强调的是,array1 的大小始终相同。但是非零数是可以改变的,无论如何,所有的零总是在数组的末尾。

我还需要 array2,通过 array1 获得。

此外,所有的数字都是正数。

您需要从数组的末尾开始,而不是开头:

public static double getLastNonZero(double [] data) throws Exception {
    for (int i = data.length-1; i >=0; i--) {
        if (data[i] != 0) {
            return data[i];
        }
    }
    
    throw new Exception("No value found");
}
public static void main(String[] args) {
    
    double array1[] = {2.3, 5.0, 4.7, 8.2, 1.8, 9.0, 0, 0, 0, 0, 0, 0};
    try {
        System.out.println(getLastNonZero(array1));         
    } catch (Exception e) {
        e.printStackTrace();
    }
}

tl;博士

Arrays
    .stream( myArray ) 
    .filter( d -> d != 0 )
    .reduce( ( first , second ) -> second   ) 

DoubleStream

不一定是最好的方法,但我们可以使用流。具体来说,DoubleStream.

从我们的数组生成流后,过滤掉零值。然后通过调用 reduce.

检索最后一个元素

我们最终得到一个 OptionalDouble 对象,该对象要么包含我们生成的 double 原语,要么是空的,这意味着在我们的原始数组中找不到匹配项。

double[] doubles = { 1.0d , 2.2d , 3.3d, 0d , 0d } ;
OptionalDouble result = 
    Arrays
    .stream( doubles ) 
    .filter( d -> d != 0 )
    .reduce( ( first , second ) -> second   ) 
;

转储到控制台。

System.out.println( result ) ;

看到这个code run live at IdeOne.com

OptionalDouble[3.3]

这是使用循环和三元运算符的一种方法(a ? b : c 表示如果 a 为真 return b,否则 return c

double array1[] = {2.3, 5.0, 4.7, 8.2, 1.8, 9.0, 0, 0, 0, 0, 0, 0};
  • 将 last 初始化为 0。
  • 遍历数组
  • 如果当前值 (i) == 0,return 最后一个。
  • 其他return我
double last = 0;
for(double i : array1) {
    last = i == 0 ? last : i;
}
System.out.println(last);

打印 9.0