Java中从单个数组中添加和减去值

3

我在从一个数组中减去数值时遇到了麻烦。如果我有数字1、2、3、4、5存储在一个数组中,我该如何找到它们之间的差异呢?

例如:1-2-3-4-5 = -13

我知道如何对数组的值进行求和,但是在从下一个数组元素中减去一个数组元素以获得正确答案方面遇到了麻烦。

int sum = 0;

if (operator == '+'){
  for ( int j = 0; j < intArray.length; j++ ) {
    sum += intArray[j]; 
  }
}
if (operator == '-'){
  for ( int j = 0; j < intArray.length; j++ ) {
    sum += intArray[j] - intArray[j+1] ; 
  }
}

System.out.println("The answer is " + sum);

4
你尝试过使用"-="而不是"+="? - Miki P
你的例子对第一个元素进行了特殊处理。是这样吗?你是指1-2-3-4-5吗?还是指-1-2-3-4-5(从第一个元素开始与从0开始)? - user3458
6个回答

2

//这是一种非常简单的解决方法

public class Minimize {

        public static int substractArrayValues(int [] q){
            int val=0;
            for (int i=0; i<q.length; i++){

                if (i==0){
                    val=q[i];
                }
                else {
                    val=val-q[i];
                }
            }
            return val;

        }

        public static void main(String[] args) {

            int [] q={1,2,3,4,5};

            System.out.println(substractArrayValues(q));
        }

    }

这将会打印出-13。


1
我假设你想要计算1-2-3-4-5的差,结果为-13。
所以你的错误在于sum+=intArray[j] - intArray[j+1] ; 操作:
         Iteration 1:- sum=-1       which is     (1-2)       sum=-1

         Iteration 2:sum=sum+(2-3)  which is     (-1+2-3)    sum=-2

         Iteration 3:sum=sum+(3-4)  which is     (-2+3-4)    sum=-3

         Iteration 4:sum=sum+(4-5)  which is     (-3+4-5)    sum=-4

         Iteration 5:sum=sum+(5-Garbage value or indexoutofbound exception)         
          sum=garbage value

尝试使用sum-=intArray[j];

1

使用IntStream和一些函数式编程

import java.util.Arrays;
import java.util.stream.IntStream;
int myArray[] = {1,2,3,4,5};
int sum = IntStream
          // get all the indices
          .range(0, myArray.length) 

          // for the 1st element use the +ve sign 
          // and for the rest use -ve sign: so it 
          // will generate 1,-2,-3,-4,-5
          .map(i -> i == 0? myArray[i] : -myArray[i]) 

          // add the generated elements using map: 1-2-3-4-5
          .sum(); 

System.out.println(sum); // -13

@soundslikeodd添加了解释,希望这样就清楚了。 - Sandipan Dey

0
你应该从索引0开始求和,然后对所有其他元素调用-=。目前你在做的是index - (index -1),这会导致失败,因为你没有检查越界。另外,在当前实现中数学运算是错误的,因为你使用值两次进行减法,而不是一次。
使用你的减法方法,请考虑以下数组A[1, 2, 3, 4]。
sum = 0;
sum += 1 - 2;
sum is -1; (Correct)
sum += 2 - 3;
sum is (-1 + -1) = -2 (Wong, should be -4)
sum += 3 - 4;
sum is (-2 - 1) = -3 (Wrong should be -8)
sum += 4 - A[4] (ERROR index out of bounds)

这里是一次减去值的实现。
if (operator == '-'){
  sum = intArray.length > 0 ? intArray[0] : 0;
  for ( int j = 1; j < intArray.length; j++ ) {
    sum -= intArray[j]; 
  }
}

我正在解释它,@soundslikeodd。 - RAZ_Muh_Taz

0
你总是在减法操作符-上执行正向求和+=。但是考虑使用Stream-API如何呢?
IntStream.of(1, 2, 3, 4, 5)
         .reduce(operatorFunction('-'))
         .ifPresent(System.out::println);

使用以下IntBinaryOperator返回函数:

static IntBinaryOperator operatorFunction(char operator) {
  if (operator == '-') {
    return (int1, int2) -> int1 - int2;
  }
  return (int1, int2) -> int1 + int2;
}

这将按预期打印-13。这就是你所需要的。请注意,您还可以使用IntStream.sum来实现简单的求和。但是,使用operatorFunction,如果您希望稍后添加*÷,也可以进行加法。

另一种编写上述代码的方法(带有中间值):

int[] yourInputArray = {1, 2, 3, 4, 5};
char operator = '-';
OptionalInt = Stream.of(yourInputArray)
                    .reduce(operatorFunction(operator));

从这里你可以调用 orElse(0) 或者使用 orElseThrow(() -> ...) 抛出异常等。查看 OptionalInt-javadoc 以获取更多选项。一旦你离开原始的 int,你可能想通过使用 Stream, BinaryOperator<Integer>Optional<Integer> 来交换代码。

顺便说一下,你当前的代码中也有一个 IndexOutOfBoundException。但是为什么要搞索引和数组呢?如果你可以使用 Stream 和如此少的代码行呢?


0
我们需要取数组中的第一个值,然后根据运算符从它开始加或减剩余的值。具体操作如下所示:
int sum, dif;
if(intArray.length >= 1){
  sum = intArray[0];
  dif = intArray[0];
}
if (operator == '+'){
   if(intArray.length > 1){
     for ( int j = 1; j < intArray.length; j++ ) {
       sum += intArray[j]; 
     }
   }
   System.out.println("The sum is = " + sum);
}
if (operator == '-'){
  if(intArray.length > 1){
    for ( int j = 1; j < intArray.length; j++ ) {
      dif -= intArray[j]; 
    }
  }
  System.out.println("The difference is = " + dif);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接