Quando è necessario rappresentare un valore senza il concetto di perdita o assenza (valore negativo), si parla di "valore assoluto".
La logica per ottenere il valore assoluto è molto semplice: "If it's positive, maintain it. If it's negative, negate it"
.
Ciò significa che la tua logica e il tuo codice dovrebbero funzionare come segue:
//If value is negative...
if ( value < 0 ) {
//...negate it (make it a negative negative-value, thus a positive value).
value = negate(value);
}
Esistono 2 modi per annullare un valore:
- Bene, negando il suo valore:
value = (-value);
- Moltiplicandolo per "100% negativo" o "-1":
value = value *
(-1);
Entrambi sono in realtà due facce della stessa medaglia. È solo che di solito non ricordi che in value = (-value);
realtà lo è value = 1 * (-value);
.
Bene, per quanto riguarda il modo in cui lo fai effettivamente in Java, è molto semplice, perché Java fornisce già una funzione per questo, nel Math class
:value = Math.abs(value);
Sì, farlo senza Math.abs()
è solo una riga di codice con una matematica molto semplice, ma perché rendere brutto il tuo codice? Usa solo Java fornitoMath.abs()
funzione ! Lo forniscono per un motivo!
Se hai assolutamente bisogno di saltare la funzione, puoi usare value = (value < 0) ? (-value) : value;
, che è semplicemente una versione più compatta del codice che ho citato nella sezione logica (3a), usando l' operatore Ternary ( ? :
) .
Inoltre, potrebbero esserci situazioni in cui si desidera rappresentare sempre la perdita o l'assenza all'interno di una funzione che potrebbe ricevere sia valori positivi che negativi.
Invece di fare un controllo complicato, puoi semplicemente ottenere il valore assoluto e negarlo: negativeValue = (-Math.abs(value));
Con questo in mente e considerando un caso con una somma di più numeri come il tuo, sarebbe una buona idea implementare una funzione:
int getSumOfAllAbsolutes(int[] values){
int total = 0;
for(int i=0; i<values.lenght; i++){
total += Math.abs(values[i]);
}
return total;
}
A seconda della probabilità che potresti aver bisogno di nuovo del codice correlato, potrebbe anche essere una buona idea aggiungerli alla tua libreria "utils", suddividendo prima tali funzioni nei loro componenti principali e mantenendo la funzione finale semplicemente come un nido di chiamate a le funzioni ora divise dei componenti principali:
int[] makeAllAbsolute(int[] values){
//@TIP: You can also make a reference-based version of this function, so that allocating 'absolutes[]' is not needed, thus optimizing.
int[] absolutes = values.clone();
for(int i=0; i<values.lenght; i++){
absolutes[i] = Math.abs(values[i]);
}
return absolutes;
}
int getSumOfAllValues(int[] values){
int total = 0;
for(int i=0; i<values.lenght; i++){
total += values[i];
}
return total;
}
int getSumOfAllAbsolutes(int[] values){
return getSumOfAllValues(makeAllAbsolute(values));
}