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的数字的索引号。但我不断收到错误“无效变量声明”。 我是一个完全的初学者,我无法发现可能出现的问题。任何帮助将受到高度赞赏。
最佳。
答案 0 :(得分:1)
两件事:
您的错误只是一个错字=没有数学 s 类,但是Math
或完全java.lang.Math
在逻辑中,如果找到更近的元素,则忘记将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();