首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在有序列表中查找最接近的值

在有序列表中查找最接近的值
EN

Stack Overflow用户
提问于 2009-07-27 09:58:08
回答 11查看 29.2K关注 0票数 26

我想知道您如何编写一个简单的java方法,在排序后的Integer列表中查找与给定值最接近的Integer。

这是我的第一次尝试:

代码语言:javascript
复制
public class Closest {

    private static List integers = new ArrayList();

    static {
        for (int i = 0; i <= 10; i++) {
            integers.add(Integer.valueOf(i * 10));
        }
    }

    public static void main(String[] args) {

        Integer closest = null;
        Integer arg = Integer.valueOf(args[0]);

        int index = Collections.binarySearch(
                integers, arg);

        if (index < 0) /*arg doesn't exist in integers*/ {
            index = -index - 1;
            if (index == integers.size()) {
                closest = integers.get(index - 1);
            } else if (index == 0) {
                closest = integers.get(0);
            } else {
                int previousDate = integers.get(index - 1);
                int nextDate =  integers.get(index);
                if (arg - previousDate < nextDate - arg) {
                    closest = previousDate;
                } else {
                    closest = nextDate;
                }
            }
        } else /*arg exists in integers*/ {
            closest = integers.get(index);
        }
        System.out.println("The closest Integer to " + arg + " in " + integers
                + " is " + closest);
    }
}

你觉得这个解决方案怎么样?我相信有一种更干净的方法来完成这项工作。

也许这样的方法存在于Java库中的某个地方,而我错过了它?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-07-27 10:32:24

试试这个小方法:

代码语言:javascript
复制
public int closest(int of, List in) {
    int min = Integer.MAX_VALUE;
    int closest = of;

    for (int v : in) {
        final int diff = Math.abs(v - of);

        if (diff < min) {
            min = diff;
            closest = v;
        }
    }

    return closest;
}

一些测试用例:

代码语言:javascript
复制
private final static List list = Arrays.asList(10, 20, 30, 40, 50);

@Test
public void closestOf21() {
    assertThat(closest(21, list), is(20));
}

@Test
public void closestOf19() {
    assertThat(closest(19, list), is(20));
}

@Test
public void closestOf20() {
    assertThat(closest(20, list), is(20));
}
票数 35
EN

Stack Overflow用户

发布于 2020-01-24 22:09:11

Kotlin很乐于助人

代码语言:javascript
复制
fun List.closestValue(value: Int) = minBy { abs(value - it) }

val values = listOf(1, 8, 4, -6)

println(values.closestValue(-7)) // -6
println(values.closestValue(2)) // 1
println(values.closestValue(7)) // 8

列表不需要在BTW中排序

编辑:从kotlin 1.4开始,minBy已弃用。首选minByOrNull

代码语言:javascript
复制
@Deprecated("Use minByOrNull instead.", ReplaceWith("this.minByOrNull(selector)"))
@DeprecatedSinceKotlin(warningSince = "1.4")
票数 15
EN

Stack Overflow用户

发布于 2014-04-02 15:43:47

没有二进制搜索的解决方案(利用列表排序):

代码语言:javascript
复制
public int closest(int value, int[] sorted) {
  if(value < sorted[0])
    return sorted[0];

  int i = 1;
  for( ; i < sorted.length && value > sorted[i] ; i++);

  if(i >= sorted.length)
    return sorted[sorted.length - 1];

  return Math.abs(value - sorted[i]) < Math.abs(value - sorted[i-1]) ?
         sorted[i] : sorted[i-1];
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1187352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档