2017-01-20 5 views
3

1つの配列から値を減算する際に問題があります。 1、2、3、4、5の数字が配列に格納されている場合、その違いをどのように見つけることができますか?例1-2-3-4-5 = -131つの配列から値を加算および減算するJava

については

私は、配列の値を合計する方法を知っているが、トラブル正しい答えを得るために、次から1つの配列要素を減算しました。

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

"+ ="の代わりに " - ="を使用してみましたか? –

+0

あなたの例は、最初の要素に対して特別な扱いをします。そうですか?あなたは1-2-3-4-5を意味しましたか?あるいは、-1-2-3-4-5(最初の要素から始めて0から始まって始まる)を意味しましたか? – Arkadiy

答えて

0

インデックス0での合計で始まり、 - =を他のすべての要素に呼び出す必要があります。現在、あなたは範囲外をチェックしていないので失敗するindex - (index -1)を実行しています。また、値を使って1回で2回減算するので、現在の実装では数学は間違っています。

ここ

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]; 
    } 
} 
+0

私はそれを説明する途中でした@soundslikeodd –

0

いったん値を減算実装である[4、1、2、3]あなたのサブトラクション法Aでこの配列を取りますオペレータ-+=。 代わりに代わりにStream-APIを使用するのはどうですか?

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

あなたが期待するよう-13を印刷し、次のIntBinaryOperator -returning機能付き

IntStream.of(1, 2, 3, 4, 5) 
     .reduce(operatorFunction('-')) 
     .ifPresent(System.out::println); 

。これはあなたが必要なすべてです。単純合計を達成するためにIntStream.sumを使用することもできます。 operatorFunctionでは、後で希望する場合は*または÷を追加することもできます。

(中間値を持つ)上記のコードを書くための別の方法:

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

ちょうどあなたのオプションのためのOptionalInt-javadocを見ているなど、ここからはorElse(0)を呼び出すことができますかorElseThrow(() -> ...)で例外をスローします。 intプリミティブから離れるとすぐに、Stream,BinaryOperator<Integer>およびOptional<Integer>を使用してコードを交換することができます。

ところで、現在のコードにIndexOutOfBoundExceptionもあります。しかし、あなたがStreamとそれほど数行のコードを使用できるのであれば、なぜインデックスと配列を使いこなすのでしょうか?

0

私はあなたが-13に等しい1-2-3-4-5を減算したいと仮定します。

だからここにあなたの間違いは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];

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); 
} 
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 
+0

@soundslikeoddはexlanationを追加しました。 –

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

関連する問題