2 caodegao caodegao 于 2016.02.03 17:12 提问

输入一个数,求有序整数Set<Integer>集合内最近且大于他的数

输入一个数,求有序整数Set集合内最近的数
如:Set orders = new HashSet();
orders.add(8);
orders.add(3);
orders.add(4);
orders.add(7);
orders.add(6);
orders.add(5);

    输入2:得到3;
    输入8:找不到返回null;

12个回答

caodegao
caodegao   2016.02.06 09:32
已采纳

我算法不是很好,所以想要咨询有没有更好的算法
我最后还是直接遍历了集合去查找
一个往上找一个往下找:
public static Integer isUpSearch(List orders, int des, boolean isUp) {
int size = orders.size();
for (int i = size; i >= 0; i--) {

    }
    return isUp ? upLoop(orders, des) : downLoop(orders, des);
}

private static Integer downLoop(List<Integer> orders, int des) {
    int size = orders.size();
    for (int i = (size - 1); i >= 0; i--) {
        if (des > orders.get(i)) {
            return orders.get(i);
        }
    }
    return null;
}

这种方式用二分查找应该是最块的,由于没时间了,我暂时用保守的方式
谢谢大家回答
caozhy
caozhy   Ds   Rxr 2016.02.03 17:53
 既然是有序序列,那么可以用二分查找,大概的代码如下:
int start = 0;
int end = orders.length() - 1;
while (start != end)
{
    pos = (end - start) / 2;
    if (orders.get(pos) < find)
        {
            start = pos + 1;
        }
        else
        {
            end = pos;
        }
}
if (pos == orders.length() - 1) return null;
return pos + 1;
wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.03 21:58

实现思路:
首先,对集合进行排序;其次,执行查找过程,先看能否找到输入的值,如果找到且该元素不是最后一个元素的话,则返回其后一个元素;
最后,如果找不到这个输入值,就找第一个比其大的数并返回。
其他情况,均返回null。实现代码参考:

 import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class OrderTest {
    public static void main(String[] args) {
        Set orders = new HashSet();
         orders.add(8);
         orders.add(3);
         orders.add(4);
         orders.add(7);
         orders.add(6);
         orders.add(5);
         System.out.println(getLatestLargerNumber(orders,2));
         System.out.println(getLatestLargerNumber(orders,8));
         System.out.println(getLatestLargerNumber(orders,6));
    }

    //查找第一个大等于number的数
    public static Integer getLatestLargerNumber(Set<Integer> list,int number){
        //集合为空或者只有一个元素时返回空
        if(list==null||list.size()==0){
            return null;
        }

        //先对Set集合进行排序
        Object[] numbers = (Object[]) list.toArray();
        Arrays.sort(numbers);

        Integer value = null;
        int length = numbers.length;
        for(int i =0;i<length;i++){
            int current = (Integer)numbers[i];
            //找到number,且它不是最后一个元素,那么i+1位置处的值一定是第一个大于number的数
            if(current==number){
                if(i+1<length){
                    value = (Integer)numbers[i+1];
                }
                break;  
            }

            //找不到number时,就找第一个比其大的元素
            if(current>number){
                value= current;
                break;
            }
        }

        return value;
    }
}

测试结果,ok,跟你需求描述的一致。

rui888
rui888   Ds   Rxr 2016.02.04 09:35

直接用本身的方法接口

 public static void main(String[] args) {
        Set orders = new HashSet();
        orders.add(8);
        orders.add(3);
        orders.add(4);
        orders.add(7);
        orders.add(6);
        orders.add(5);
        orders.add(2);
        List items = new ArrayList(new TreeSet(orders));
        Integer needFound = 2;
        // 输入2:得到3;
        Integer x = (Integer) (items.indexOf(needFound) < items.size() - 1 ? items.get(items.indexOf(needFound)+1)
                : null);
        System.out.println("输入2: 测试结果-->" + x);
        // 输入8:找不到返回null;
        needFound = 8;
        x = (Integer) (items.indexOf(needFound) < items.size() - 1 ? items.get(items.indexOf(needFound)+1) : null);
        System.out.println("输入8:测试结果-->" + x);
    }
rui888
rui888   Ds   Rxr 2016.02.03 17:35

输入2:得到3;

这个你将2 数据放到集合中,然后对集合进行排序 ,然后 排序好取 2后面的数据 。当然取不到就报null

xionglangs
xionglangs   Rxr 2016.02.04 12:12

public static void main(String[] args) {
Set set = new TreeSet();
set.add(1);
set.add(3);
set.add(5);
set.add(7);
set.add(9);
set.add(2);
set.add(4);
set.add(6);
set.add(8);
set.add(10);
Scanner sc = new Scanner(System.in);
System.out.println("输入查询的数");
int id = sc.nextInt();
id = DriveNetMainWindow.shuju(set, id);
if (id == 0) {
System.out.println("找不到返回null");
} else {
System.out.println("得到"+id);
}
}

public static int shuju(Set<Integer> set, int id) {
    Iterator<Integer> it = set.iterator();
    while (it.hasNext()) {
        int i = it.next();
        if (i - id > 0) {
            return i;
        }
    }
    return 0;
}
lm_whales
lm_whales   Rxr 2016.02.07 21:54

有序集是已经排序了的,二分查找即可
如果用集合,集合不暴露内部状态,有点麻烦

lm_whales
lm_whales   Rxr 2016.02.07 21:54

有序集是已经排序了的,二分查找即可
如果用集合,集合不暴露内部状态,有点麻烦

lm_whales
lm_whales   Rxr 2016.02.07 21:55

有序集是已经排序了的,二分查找即可
如果用集合,集合不暴露内部状态,有点麻烦

sinat_31535993
sinat_31535993   Rxr 2016.02.03 17:33

既然已经的有序的集合了,直接遍历呗,降序集合当第n个大于,第N+1个小于时,第N个就是,反之升序集合N+1个就是

共12条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
欧拉函数--(求小于n的整数中与n互质的个数)
数学应用--欧拉函数       在nefuoj上遇到一个问题让求小于n的整数中与n互质的个数,此问题困扰了我一段时间啊!最后还是讨教了度娘,才明白使用欧拉函数做。首先,欧拉好函数的概念,f(x)=x*(1-1/p1)*(1-1/p2).....,其中p1,p2。。是n的素因子。 1.直接 while(cin>>x)     {         y=x;         k=(int)
求一个数的临近的较大的2的整数次幂
偶然看到云风的http://blog.codingnow.com/2011/12/buddy_memory_allocation.html 代码,发现了一个比较巧妙的实现。   static inline int is_pow_of_2(uint32_t x) {  return !(x & (x-1)); } static inline uint32_t next_pow_of_2
寻找距离某数最近的素数(C语言)
寻找距离某数最近的素数,从目标数开始双向寻找。(C语言),
找出大于给定数数最小的素数
找出大于给定数数最小的素数 /* Return next prime; assume N >= 10 */ // 设置素数 static int NextPrime( int N ) { int i; if( N % 2 == 0 ) N
找到大于一个正整数N的最小2的次幂数
在看JDK1.7中ArrayDeque源码时,有一个函数是这样写的: private void allocateElements(int numElements) { int initialCapacity = MIN_INITIAL_CAPACITY; // Find the best power of two to hold elements. /
输入一个数,求这个数范围内的奇数和偶数的和
/**********************************************************  输入一个数,求这个数范围内的奇数和偶数的和  . QQ139767**********************************************************/#include void main(){ int a=0,b=0,c=1,d;  pri
从键盘上输入一个数,将其插入到数列{2,5,6,8,12,13,15,17,19,22}中,并保证该数列的有序性。
#include int main() { int i,j,x,k=10,a[11]={2,5,6,8,12,13,15,17,19,22}; scanf("%d",&x); for(i=0;i<k&&a[i]<x;i++) j=i; for(j=k;j>i;j--) a[j]=a[j-1]; a[j]=x; for(i=0;i<=k;i++)
3:输入一个整数,求这个数的阶乘
#include mian() { int fac=1; int n;         scanf("%d",&n);        if(n==1||n==0)                         // 若这个数为1或0,则输出1.     {   printf("所求数字的阶乘为1"); } if(n>1) { while(n>1) { fac=
给定一个整数,求出该整数的所有质因数
题目:质因数分解,给定一个整数,求该数的所有质因数,例如 90 = 2*3*3*5。  质数又称素数,有无限个。一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除(除0以外)的数称之为素数(质数);否则称为合数。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。  在自然数域内,质数是...
将大于形参m且紧靠m的k个素数存入xx所指的数组中。 例如,若输入17, 5,则应输出:19, 23, 29, 31, 37。C语言编程题【21题】
#include void fun(int m, int k, int xx[]) { int i, j; int p = 0; for(i=m+1;i>m;i++) { for(j=2;j<i;j++) { if(i%j==0) break; } if(j == i) xx[p++] = i; if(p>k) break; } } main()