Cuando necesita representar un valor sin el concepto de pérdida o ausencia (valor negativo), eso se denomina "valor absoluto".
La lógica para obtener el valor absoluto es muy simple: "If it's positive, maintain it. If it's negative, negate it".
Lo que esto significa es que su lógica y código deberían funcionar de la siguiente manera:
//If value is negative...
if ( value < 0 ) {
//...negate it (make it a negative negative-value, thus a positive value).
value = negate(value);
}
Hay 2 formas de negar un valor:
- Por, bueno, negando su valor:
value = (-value);
- Al multiplicarlo por "100% negativo" o "-1":
value = value *
(-1);
Ambas son en realidad dos caras de la misma moneda. Es solo que generalmente no recuerdas que value = (-value);es realmente value = 1 * (-value);.
Bueno, en cuanto a cómo lo haces realmente en Java, es muy simple, porque Java ya proporciona una función para eso, en Math class:value = Math.abs(value);
Sí, hacerlo sin él Math.abs()es solo una línea de código con matemática muy simple, pero ¿por qué hacer que su código se vea feo? ¡Solo use la Math.abs()función proporcionada por Java ! Lo proporcionan por una razón!
Si realmente necesita omitir la función, puede usar value = (value < 0) ? (-value) : value;, que es simplemente una versión más compacta del código que mencioné en la sección lógica (3ra), usando el operador Ternary ( ? :) .
Además, puede haber situaciones en las que desee representar siempre la pérdida o ausencia dentro de una función que pueda recibir valores positivos y negativos.
En lugar de hacer una comprobación complicada, simplemente puede obtener el valor absoluto y negarlo: negativeValue = (-Math.abs(value));
Con eso en mente, y considerando un caso con una suma de múltiples números como el tuyo, sería una buena idea implementar una función:
int getSumOfAllAbsolutes(int[] values){
int total = 0;
for(int i=0; i<values.lenght; i++){
total += Math.abs(values[i]);
}
return total;
}
Dependiendo de la probabilidad de que pueda necesitar código relacionado nuevamente, también podría ser una buena idea agregarlos a su propia biblioteca "utils", dividiendo dichas funciones en sus componentes principales primero y manteniendo la función final simplemente como un nido de llamadas a las funciones ahora divididas de los componentes principales:
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));
}