我有两个值。一个是静态的,等于24
int A = 24;
我有条目清单:
[0, 21, 45, 76, 98]
所有出现都在循环中,我想获得最接近A:
的值0 - 24
21 - 24
45 - 48
76 - 72
98 - 96
如何计算?
答案 0 :(得分:1)
使用java8,您可以流式传输数组或列表并映射
public static void main(String[] args) {
int a = 24;
List<Integer> mL = Arrays.asList(0, 21, 45, 76, 98);
Map<Integer, Integer> m = mL.stream().collect(Collectors.toMap(Integer::intValue, x -> {
int r = a * (int) Math.round(x / (double) a);
return r == 0 ? a : r;
}));
System.out.println(m);
}
输出将是一个地图,其中键是要分析的值,值是与其最接近的增量
{0=24, 98=96, 21=24, 76=72, 45=48}
答案 1 :(得分:0)
您可以使用浮点除法将每个值除以int
,将其四舍五入到最接近的a
,然后再将其再乘以int a = 24;
int[] values = new int[]{0, 21, 45, 76, 98};
int[] result =
Arrays.stream(values).map(v -> a * (int) Math.round(v / (double) a)).toArray();
:< / p>
NUnit.Framework.SuccessException
答案 2 :(得分:0)
要查找小于x
的数字n
的最大倍数a
,您可以使用一些算术:
int x = n - n % a;
现在,如果您想获得最接近的倍数,无论是大于还是小于a
,您都可以使用if语句:
if (a - x > (x + n) - a)
x = x + a
有关数字列表,只需循环它们或使用Stream API。
答案 3 :(得分:0)
假设数组也是整数,将整数a
舍入到最接近的整数n
的正确方法如下: 1
(a + n/2) / n * n
由于整数数学的工作方式,希望a / n * n
方法应该是熟悉的方法,以获得floor
- 类行为。 n/2
偏向于给你round
- 就像行为一样。 2
n / 2
范围内输入将导致此失败。double
,则使用int
可能工作(尽管我不确定证据是什么)。但对于long
来说,它肯定不够。<子> 1。用于使多个输入值有效的样板流/循环代码留给读者练习。
<子> 2。为了完整起见,如果你使用n-1
的偏见,就会得到ceil
- 就像行为一样!
答案 4 :(得分:0)
一种方法是取余数,看看是否需要从给定数字中加或减来得到最接近的数字。如果余数小于A
的一半,则从数字中减去余数,否则将余数与A
之间的差值相加。另外作为快速退出检查,如果数字少于A
,则最接近的数字是A
本身。
public static int[] closest(int a, int[] b){
int[] result = new int[ b.length ];
int halfOfA = a/2;
for (int i = 0; i < b.length; i++){
if ( b[i] <= a ){
result[i] = a;
}else{
int rem = b[i] % a;
if (rem < halfOfA) result[i] = b[i] - rem;
else result[i] = b[i] + (a - rem);
}
}
return result;
}
答案 5 :(得分:-1)
你可以这样做:
A/2
时private static int closestTo(int a, int i) {
int res = a;
while (Math.abs(res - i) > (a / 2.0) && res< i + a) {
res += a;
}
return res;
}
并使用
public static void main(String[] args) {
int A = 24;
int[] tab = new int[]{0, 21, 45, 76, 98};
for (int i : tab) {
System.out.println(i + " - " + closestTo(A, i));
}
}