【问题标题】:How can I find the closest number from an array, rounding down如何从数组中找到最接近的数字,四舍五入
【发布时间】:2021-05-31 10:30:37
【问题描述】:

我要做的是获取一组数字,这些数字逐渐变大,确定我可以四舍五入的最高数字。我不确定这是否有意义,我举个例子。请记住,为了解释,我将数字变得更简单,删除最后一个数字是行不通的。我使用的数组有 100 个数字,数百万。

int[] breakpoint = new int[] {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
     110, 120, 130, 140, 150, 160, 170, 180, 190, 200};
    int totalValue = 153;
    int valueDisplayed;
         //???
label.Text = valueDisplayed.toString();

所以在这种情况下我想要返回一个值 15(数组中项目的索引),这样我就可以显示该值(例如使用标签)。当然必须有一个简单的方法来做到这一点?我在任何地方都找不到答案。

【问题讨论】:

  • 我不完全确定您所说的“向下取整”是什么意思。究竟是什么四舍五入,15 是从哪里来的?
  • 而不是试图找到。一个现成的答案,只是尝试解决问题。最简单的解决方案是迭代直到找到一个大于目标的数字,然后检查前一个以找到最接近的数字。当然有更优雅或更快的解决方案,但这可能足以开始
  • the highest one i can round down to 到底是什么意思?什么是 totalValue,为什么要从 153 变为 15?只能显示 2 位数字吗?
  • 15 将是数组中的第 15 个数字。通过向下舍入,我的意思是 totalValue 将向下舍入到数组中最接近的数字。例如,如果 totalValue 为 19,它仍会舍入为 10,即 1。
  • 对于中等数量的排序数据,您可以使用二进制搜索 - 从“中间”数字开始并检查它与目标相比是否更大或更小。如果它更大,请检查之前的数字,看看它是否是您想要的。否则,取左半边或右半边,然后再试一次

标签: c# arrays rounding


【解决方案1】:

您可以使用Array.BinarySearch,它会为您提供所有您需要知道的信息:

public static int GetNearestIndex<T>(T[] items, T value)
{
    int index = Array.BinarySearch(items, value);
    if(index >= 0) 
        return index;
    if(index == -1)
        return 0; // is lower than first, so maybe you want to return -1
    return ~index - 1;
}

我正在使用bitwise complement operator 来确定正确的索引。

.Net Fiddle 有一些极端情况。

【讨论】:

  • 不应该是if (index == -1) return -1;吗?
  • @41686d6564:是的,你可能是对的。我评论了它,所以 OP 可以决定接下来应该发生什么。取决于他是否总是需要一个现有的值。
【解决方案2】:

一个简单的实现可能就足够了

valueDisplayed = breakpoint[Array.FindIndex(breakpoint, v => v > totalValue) - 1];

但您可能需要进行二分搜索以加快速度

【讨论】:

  • 看来 OP 想要的是索引,而不是值。所以,很可能是valueDisplayed = Array.FindIndex(...
【解决方案3】:

您可以使用System.Linq 找到向下舍入断点数组的索引。

var index = breakpoint.Where(i => i <= totalValue).ToList().Count - 1;

这行代码将选择数组中低于totalValue 的所有元素,放入一个列表中,并计算它的条目。要获取索引,只需从中减去 1。

此解决方案假定breakpoint 中的所有条目都按升序排列。

这是我能想到的最简单的解决方案,但由于要搜索整个数组,因此计算量可能会很大。

【讨论】:

    猜你喜欢
    • 2011-03-25
    • 2019-02-09
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    相关资源
    最近更新 更多