在Java中查找数组中最接近32的数字的索引号

时间:2017-07-10 16:58:32

标签: java arrays

fseek(fp, 0, SEEK_END);
long fp_len;
fp_len = ftell(fp); 
fseek(fp, 0, SEEK_SET);

char *text = malloc(sizeof(*text) * fp_len + 1);
size_t len = fread(text, fp_len, 1, fp);

text[fp_len] = '\0';

我编写了上面粘贴的方法来查找数组中最接近32的数字的索引号。但我不断收到错误“无效变量声明”。 我是一个完全的初学者,我无法发现可能出现的问题。任何帮助将受到高度赞赏。

最佳。

3 个答案:

答案 0 :(得分:1)

两件事:

  1. 您的错误只是一个错字=没有数学 s 类,但是Math或完全java.lang.Math

  2. 在逻辑中,如果找到更近的元素,则忘记将diff刷新为newDiff。 所以你的if语句必须如下:

    if (newDiff < diff){
      diff = newDiff;
      index=i;
    }
    

答案 1 :(得分:1)

使用Java 8流可以做到这一点:

public int indexOfClosestNumber(int number, int... a) {
    return IntStream.range(0, a.length)
        .boxed()
        .min(Comparator.comparingInt(i -> Math.abs(number - a[i])))
        .orElse(-1);
}

我已经更改了方法的名称和签名,使其更有意义且更易于使用。

代码的想法是我们有一系列int s,我们希望根据提供的比较器找到该索引范围内的最小值。为了能够为Stream.min方法指定比较器,我们需要Stream<Integer>而不是IntStream,这就是我使用{{1}的原因}}。然后,比较器通过比较阵列的每个元素与提供的.boxed()的距离来工作。由于number方法返回Stream.min,我们需要使用Optional<Integer>方法使用默认值(如果提供的数组为空,则会返回此值)。

要使用上述方法,请执行以下操作:

Optional.orElse

答案 2 :(得分:1)

如果您可以保证数组中的元素是唯一的,可以使用TreeMap#ceiling完成:

 int a[] = { -1, 58, 32, 16, 54 };
    int index = IntStream.range(0, a.length)
            .boxed()
            .collect(Collectors.toMap(x -> a[x], x -> x, (left, right) -> left, TreeMap::new))
            .ceilingEntry(32).getValue();