Java:在某个集合中查找最近的数字

Java:在某个集合中查找最近的数字,java,Java,我有一组静态的有序数字{1,2,4,10,14,20,21,24,29,30},可以存储在任何集合中。如果传入一个新号码,我需要能够找到与新号码最近的较大号码 例如: 如果我的有序数的静态集合是{1,2,4,10,14,20,21,24,29,30}。 传入的数字是23,最接近的较大数字是24 我考虑将静态数字存储到一个数组中。循环数组,然后尝试查找最接近的数字,但此解决方案为O(n)。有没有更快的方法?如果你有一个有序列表,你可以把它放在一个列表中,然后调用 如果返回索引为负数,则需要将其转换

我有一组静态的有序数字{1,2,4,10,14,20,21,24,29,30},可以存储在任何集合中。如果传入一个新号码,我需要能够找到与新号码最近的较大号码

例如: 如果我的有序数的静态集合是{1,2,4,10,14,20,21,24,29,30}。 传入的数字是23,最接近的较大数字是24


我考虑将静态数字存储到一个数组中。循环数组,然后尝试查找最接近的数字,但此解决方案为O(n)。有没有更快的方法?

如果你有一个有序列表,你可以把它放在一个列表中,然后调用


如果返回索引为负数,则需要将其转换为相应的正索引,并确保该数字大于传入的数字(应将其转换为正数,只需注意是否大于列表中的最后一个数字)。

如果您有有序列表,你可以把它放在一个列表中,然后打电话给我


如果返回索引为负数,则需要将其转换为相应的正索引,并确保该数字大于传入的数字(应将其转换为正数,注意是否大于列表中的最后一个数字)。

假设整数数组已排序,然后你可以使用

binarySearch
调用的结果是数组中键的偏移量或“插入点”;i、 e.需要插入钥匙的偏移量。如果得到一个插入点(表示为负数),则可以使用该插入点来标识数组中的下一个最大或下一个最小的数字。(javadoc中解释了“插入点”的确切含义和表示形式。)

此过程的复杂性将是
O(logN)


这将比使用
Collections.binarySearch
更快,因为后者需要先将
int[]
转换为
Integer[]
,然后才能将其包装到列表中。如果您是从一个
整数[]
开始的,那么
数组还有另一个重载。binarySearch
可以在任何对象数组上工作


它也比从输入数组创建
TreeSet
更快。然而,树集的优点是,一旦你创建了树集,更新会更便宜。。。与基于数组或arraylist的表示法相比。(但更新不是上述要求的一部分。)

假设整数数组已排序,则可以使用

binarySearch
调用的结果是数组中键的偏移量或“插入点”;i、 e.需要插入钥匙的偏移量。如果得到一个插入点(表示为负数),则可以使用该插入点来标识数组中的下一个最大或下一个最小的数字。(javadoc中解释了“插入点”的确切含义和表示形式。)

此过程的复杂性将是
O(logN)


这将比使用
Collections.binarySearch
更快,因为后者需要先将
int[]
转换为
Integer[]
,然后才能将其包装到列表中。如果您是从一个
整数[]
开始的,那么
数组还有另一个重载。binarySearch
可以在任何对象数组上工作


它也比从输入数组创建
TreeSet
更快。然而,树集的优点是,一旦你创建了树集,更新会更便宜。。。与基于数组或arraylist的表示法相比。(但更新不是上述要求的一部分。)

在Java 1.6中,有一个接口。TreeSet和ConcurrentSkipListSet都实现了这个接口。它是SortedSet的子接口,旨在取代SortedSet

那么,你现在在这个NavigableSet中有了你的收藏。现在有两个方法-and将分别小于或大于的元素返回给参数,如果有,则返回相等;如果没有这样的元素,则返回null

有了这一点,您可以按照以下思路做一些事情:

int closest(int arg) {
    Integer ceil = set.ceiling(arg);
    Integer floor = set.floor(arg);

    if(ceil == null) { return floor; }
    if(floor == null) { return ceil; }

    int cdiff = ceil - arg;
    int fdiff = arg - floor;

    if(cdiff < fdiff) { return ceil; }
    else { return floor; }
}
int最近(int arg){
整数ceil=设置上限(arg);
整数地板=设置地板(arg);
如果(ceil==null){返回楼层;}
如果(floor==null){return ceil;}
int cdiff=ceil-arg;
int fdiff=arg-地板;
if(cdiff
请注意,对于小型阵列,此实现与其他实现之间的速度差异可能可以忽略不计


如果您正在处理大量的数字集,您可能希望使用双链接的底层实现您自己的(它是一个整洁的数据结构)。然后,您可以到达值应该位于的位置(如果不是),然后轻松地在底部上下移动以获得下一个更高和更低的数字

在Java1.6中,有一个接口。TreeSet和ConcurrentSkipListSet都实现了这个接口。它是SortedSet的子接口,旨在取代SortedSet

那么,你现在在这个NavigableSet中有了你的收藏。现在有两个方法-and将分别小于或大于的元素返回给参数,如果有,则返回相等;如果没有这样的元素,则返回null

有了这一点,您可以按照以下思路做一些事情:

int closest(int arg) {
    Integer ceil = set.ceiling(arg);
    Integer floor = set.floor(arg);

    if(ceil == null) { return floor; }
    if(floor == null) { return ceil; }

    int cdiff = ceil - arg;
    int fdiff = arg - floor;

    if(cdiff < fdiff) { return ceil; }
    else { return floor; }
}
int最近(int arg){
整数ceil=设置上限(arg);
整数地板=设置地板(arg);
如果(ceil==null){返回楼层;}
如果(floor==null){return ceil;}
int cdiff=ceil-arg;
int fdiff=arg-地板;
if(cdiff
请意识到,对于小型阵列,此实现与其他实现之间的速度差异可能会忽略不计