Kiedy musisz przedstawić wartość bez pojęcia straty lub braku (wartość ujemna), nazywa się to „wartością bezwzględną”.
Układ logiczny, aby uzyskać wartość bezwzględna jest bardzo prosta "If it's positive, maintain it. If it's negative, negate it"
.
Oznacza to, że Twoja logika i kod powinny działać w następujący sposób:
//If value is negative...
if ( value < 0 ) {
//...negate it (make it a negative negative-value, thus a positive value).
value = negate(value);
}
Istnieją 2 sposoby na zanegowanie wartości:
- Cóż, negując jego wartość:
value = (-value);
- Mnożąc ją przez „100% ujemne” lub „-1”:
value = value *
(-1);
Obie są w rzeczywistości dwiema stronami tej samej monety. Po prostu zazwyczaj nie pamiętasz, że value = (-value);
tak jest value = 1 * (-value);
.
Cóż, jeśli chodzi o sposób, w jaki faktycznie to robisz w Javie, jest to bardzo proste, ponieważ Java zapewnia już odpowiednią funkcję w Math class
:value = Math.abs(value);
Tak, zrobienie tego bez Math.abs()
to tylko wiersz kodu z bardzo prostą matematyką, ale po co sprawiać, by kod wyglądał brzydko? Po prostu użyj Math.abs()
funkcji dostarczonej przez Javę ! Zapewniają to z jakiegoś powodu!
Jeśli absolutnie potrzebujesz pominąć tę funkcję, możesz użyć value = (value < 0) ? (-value) : value;
, która jest po prostu bardziej zwartą wersją kodu, o którym wspomniałem w sekcji logiki (3.), używając operatora trójargumentowego ( ? :
) .
Ponadto mogą zaistnieć sytuacje, w których chcesz zawsze przedstawiać utratę lub nieobecność w funkcji, która może otrzymywać zarówno wartości dodatnie, jak i ujemne.
Zamiast wykonywać skomplikowane sprawdzenie, możesz po prostu uzyskać wartość bezwzględną i zanegować ją: negativeValue = (-Math.abs(value));
Mając to na uwadze i biorąc pod uwagę przypadek z sumą wielu liczb, takich jak twoja, dobrym pomysłem byłoby zaimplementowanie funkcji:
int getSumOfAllAbsolutes(int[] values){
int total = 0;
for(int i=0; i<values.lenght; i++){
total += Math.abs(values[i]);
}
return total;
}
W zależności od prawdopodobieństwa, że będziesz potrzebować ponownie pokrewnego kodu, dobrym pomysłem może być dodanie ich do własnej biblioteki „narzędzi”, rozdzielając najpierw takie funkcje na ich podstawowe komponenty i utrzymując ostatnią funkcję po prostu jako zbiór wywołań podzielone teraz funkcje głównych komponentów:
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));
}