Quando você precisa representar um valor sem o conceito de perda ou ausência (valor negativo), isso é chamado de "valor absoluto".
A lógica para obter o valor absoluto é muito simples: "If it's positive, maintain it. If it's negative, negate it"
.
O que isso significa é que sua lógica e código devem funcionar da seguinte maneira:
//If value is negative...
if ( value < 0 ) {
//...negate it (make it a negative negative-value, thus a positive value).
value = negate(value);
}
Existem duas maneiras de negar um valor:
- Negando seu valor:
value = (-value);
- Ao multiplicá-lo por "100% negativo" ou "-1":
value = value *
(-1);
Ambos são na verdade dois lados da mesma moeda. É que você geralmente não se lembra que value = (-value);
é realmente value = 1 * (-value);
.
Bem, sobre como você realmente faz isso em Java, é muito simples, porque Java já fornece uma função para isso, no Math class
:value = Math.abs(value);
Sim, fazê-lo sem Math.abs()
é apenas uma linha de código com uma matemática muito simples, mas por que tornar seu código feio? Basta usar a Math.abs()
função fornecida pelo Java ! Eles fornecem isso por uma razão!
Se você absolutamente precisar pular a função, poderá usar value = (value < 0) ? (-value) : value;
, que é simplesmente uma versão mais compacta do código que mencionei na seção lógica (3), usando o operador Ternary ( ? :
) .
Além disso, pode haver situações em que você sempre queira representar perda ou ausência em uma função que possa receber valores positivos e negativos.
Em vez de fazer uma verificação complicada, você pode simplesmente obter o valor absoluto e negá-lo: negativeValue = (-Math.abs(value));
Com isso em mente, e considerando um caso com uma soma de vários números como o seu, seria uma boa idéia implementar uma função:
int getSumOfAllAbsolutes(int[] values){
int total = 0;
for(int i=0; i<values.lenght; i++){
total += Math.abs(values[i]);
}
return total;
}
Dependendo da probabilidade de você precisar do código relacionado novamente, também pode ser uma boa ideia adicioná-los à sua própria biblioteca "utils", dividindo essas funções em seus componentes principais primeiro e mantendo a função final simplesmente como um ninho de chamadas para as funções agora divididas dos componentes principais:
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));
}