Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何确定更接近的数字?_Java - Fatal编程技术网

Java:如何确定更接近的数字?

Java:如何确定更接近的数字?,java,Java,我收到一个大小不同的ArrayList(width和height)。根据我的ImageView大小,我希望在此ArrayList中获得更接近的宽度 获得更接近的数字的最佳算法是什么 示例:宽度为1024。在此ArrayList中,有以下几种可能性: 宽度:58 宽度:256 宽度:512 宽度:1048 宽度:2090 迭代数组。计算数组中每个宽度到“目标”宽度值的距离(取差值的绝对值)。以最小距离跟踪项目 伪代码,假设数组至少有一个元素: int minDiff = Math.abs(tar

我收到一个大小不同的
ArrayList
width
height
)。根据我的
ImageView
大小,我希望在此
ArrayList
中获得更接近的宽度

获得更接近的数字的最佳算法是什么

示例:宽度为1024。在此
ArrayList
中,有以下几种可能性:

  • 宽度:58
  • 宽度:256
  • 宽度:512
  • 宽度:1048
  • 宽度:2090

迭代数组。计算数组中每个宽度到“目标”宽度值的距离(取差值的绝对值)。以最小距离跟踪项目

伪代码,假设数组至少有一个元素:

int minDiff = Math.abs(targetWidth - width_of_item_0);
int minDiff_index = 0;
for (int i = 1; i < itemCount; i++)
{
    int diff = Math.abs(targetWidth - width_of_item_i)
    if (diff < minDiff)
    {
       minDiff = diff
       minDiff_index = i
    }
}

// minDiff_index now points at the closest item to targetWidth
int minDiff=Math.abs(targetWidth-项目0的宽度);
int minDiff_指数=0;
对于(int i=1;i
迭代数组(假设数组按升序排序),从宽度值中减去每个值,当减去的值不小于1时,计算宽度值与下面的值之间的绝对差,并降低该值,即,数组中上次减去的值和下一次要减去的值。在这两个值中,差异最小的值应该最接近

代码中解释的内容的简单版本:

int width;
int result;
int[] widthArray;// the array is sorted in the ascending 

....

int tempDiff=width-widthArray[0];
int i=1;
while(tempDiff<0 && i < widthArray.length){
    tempDiff=width-widthArray[i];
    i++
}
if(i==widthArray.length)
    result=widthArray[i];
else
    result=((width-widthArray[i-1])>(widthArray[i]-width))?
           widthArray[i]:
           widthArray[i-1];
int宽度;
int结果;
int[]宽度数组;//数组按升序排序
....
int tempDiff=宽度宽度数组[0];
int i=1;
而(tempDiff(widthArray[i]-width))?
宽度数组[i]:
宽度数组[i-1];

在java 1.8中,我将使用缩减操作:

int closest = options.stream()
                     .reduce(Integer.MAX_VALUE, (best, current) ->
                              Math.abs(current - target) < Math.abs(best - target) ? current : best);
int=options.stream()
.reduce(Integer.MAX_值,(最佳,当前)->
Math.abs(当前目标)
如果选项已排序且没有重复项,如示例中所示,则可以使用二进制搜索。这将返回一个索引,如果存在精确匹配(那么您可以只返回搜索值),或一个负数,您可以使用
-returnvalue-1
将其转换为插入点

插入点是大于搜索值(或数组长度,如果没有)的第一个数字的索引。因此,如果我们在中间得到一个索引,我们只需要检查那个索引和前一个的数目,它比搜索值小。因为我们知道哪个值更小,哪个值更大,所以我们不需要
abs
来计算差值:

public static int getClosest(int number, int... from) {
    int ix=Arrays.binarySearch(from, number);
    if(ix>=0) { // exact match
        return number;
    }
    ix=-ix-1;
    return from[ix==0 || ix<from.length && number-from[ix-1]>from[ix]-number? ix: ix-1];
}

它将打印
1048
。但始终注意按排序顺序提供可用的选项,不要重复…

简单地将两个值相互减去如何?我能想到的唯一算法是减法。仅减法会产生负数,请确保使用
Math.abs()保持正数。
int width=1024;
int choice=getClosest(width, 58, 256, 512, 1048, 2090);
System.out.println(choice);