2017-01-20 1 views
3

Je rencontre des problèmes pour soustraire des valeurs d'un seul tableau. Si j'ai les numéros 1, 2, 3, 4, 5 stockés dans un tableau, comment puis-je trouver la différence?Ajouter et soustraire des valeurs d'un seul tableau Java

Par exemple 1-2-3-4-5 = -13

Je sais comment additionner les valeurs d'un tableau, mais ayant du mal à soustraire un élément de tableau de l'autre pour obtenir la bonne réponse.

int somme = 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

Avez-vous essayé d'utiliser "- =" au lieu de "+ ="? –

+0

Votre exemple donne un traitement spécial au premier élément. Est-ce correct? Vouliez-vous dire 1-2-3-4-5? Ou voulez-vous dire -1-2-3-4-5 (en commençant par le premier élément vs en commençant par 0)? – Arkadiy

Répondre

0

Vous devez commencer par a la somme à l'index 0, puis appeler - = tous les autres éléments. actuellement vous faites index - (index -1) qui échouera puisque vous ne vérifiez pas hors limites. De plus, le calcul sera erroné dans votre implémentation actuelle car vous utilisez des valeurs pour soustraire deux fois au lieu d'une seule fois.

Prenez ce tableau avec votre méthode soustraction 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) 

Voici la mise en œuvre qui soustrait les valeurs une fois

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

j'étais au milieu de l'expliquer @soundslikeodd –

0

Vous faites toujours une somme positive += sur l'opérateur -. Mais qu'en est-il de l'utilisation du Stream-API à la place?

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

avec la fonction IntBinaryOperator -retour suivante:

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

qui imprime -13 que vous attendez. C'est tout ce dont vous avez besoin. Notez que vous pouvez également utiliser IntStream.sum pour obtenir une somme simple. Avec le operatorFunction cependant, vous pouvez également ajouter * ou ÷ plus tard si vous le souhaitez.

Une autre façon d'écrire le code ci-dessus (avec des valeurs intermédiaires):

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

De là, vous pouvez appeler orElse(0) ou jeter une exception avec orElseThrow(() -> ...), etc. Il suffit de jeter un oeil à la OptionalInt-javadoc pour vos options. Dès que vous vous éloignez de la primitive int, vous pouvez échanger le code en utilisant Stream, BinaryOperator<Integer> et Optional<Integer>. Par ailleurs, il existe également un code IndexOutOfBoundException dans votre code actuel. Mais pourquoi jouer avec des index et des tableaux, si vous pouvez utiliser Stream s et si peu de lignes de code?

0

Je suppose que vous voulez soustraire 1-2-3-4-5 qui est égal à -13.

vient donc ici votre erreur sum+=intArray[j] - intArray[j+1] ;

Opération: -

  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 

Essayez d'utiliser sum-=intArray[j];

0

Nous devons prendre la première valeur du tableau, puis soustraire ou ajouter les valeurs restantes de et en fonction de l'opérateur. Cela se fait, comme indiqué ci-dessous:

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

Avec IntStream et un peu de programmation fonctionnelle

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 ajouté exlanation, espérons que cela le rend clair. –

2

// Ceci est un moyen assez simple de le résoudre

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

    } 

Ce imprimera -13