找到与确定的多重值最接近的值

时间:2017-12-05 17:53:33

标签: java

我有两个值。一个是静态的,等于24

int A = 24;

我有条目清单:

[0, 21, 45, 76, 98]

所有出现都在循环中,我想获得最接近A:

的值
0 - 24
21 - 24
45 - 48
76 - 72
98 - 96

如何计算?

6 个答案:

答案 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来说,它肯定不够。
  • 这种整数方法可能相当于@CodeApprentice's answer,我不确定。但这种方法避免了条件。

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