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