当您需要表示一个没有丢失或缺失概念的值(负值)时,称为“绝对值”。
获取绝对值的逻辑很简单:"If it's positive, maintain it. If it's negative, negate it"。
这意味着你的逻辑和代码应该像下面这样工作:
//If value is negative...
if ( value < 0 ) {
//...negate it (make it a negative negative-value, thus a positive value).
value = negate(value);
}
有两种方法可以否定一个值:
- 好吧,否定它的价值:
value = (-value);
- 乘以“100% 负”或“-1”:
value = value *
(-1);
两者实际上是同一枚硬币的两个面。只是你通常不记得value = (-value);实际上是value = 1 * (-value);。
嗯,至于你在 Java 中是怎么做的,这很简单,因为 Java 已经为此提供了一个函数,在Math class:value = Math.abs(value);
是的,不使用Math.abs() 只是一行代码,数学非常简单,但为什么要让你的代码看起来很难看呢?只需使用 Java 提供的Math.abs() 函数!他们提供它是有原因的!
如果你绝对需要跳过这个函数,你可以使用value = (value < 0) ? (-value) : value;,它只是我在逻辑(3rd)部分提到的代码的一个更紧凑的版本,使用Ternary operator (? :)。
此外,在某些情况下,您可能希望始终在可能接收正值和负值的函数中表示丢失或缺失。
您可以简单地获取绝对值并将其取反,而不是进行一些复杂的检查:negativeValue = (-Math.abs(value));
考虑到这一点,并考虑像您这样的多个数字之和的情况,实现一个函数将是一个好主意:
int getSumOfAllAbsolutes(int[] values){
int total = 0;
for(int i=0; i<values.lenght; i++){
total += Math.abs(values[i]);
}
return total;
}
根据您可能再次需要相关代码的可能性,将它们添加到您自己的“utils”库中也是一个好主意,首先将这些函数拆分为其核心组件,并将最终函数简单地维护为一个嵌套对核心组件的现拆分函数的调用次数:
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));
}