java如何实现两个数最接近的比较 例如
public int getAdjacent(List <Integer>list,int x);用list集合里面的元素值跟x比较,首先取单个元素计较,再取两个元素相加比较,直到N个元素相加比较,最后返回最接近x的数,这个最接近x的数必须比x小,也就是单个比较的话首先先去掉大于x的元素再比较 ,如此类推,直到N个相加输去掉大于X的数再比较如:List xlist = new ArrayList();
for(int i=0;i<list.size();i++)
{
 if(list.get(i)<x)
{
 xlist.add(list.get(i))
}
}最后用xlist元素的值跟x比较,并把返回的最接近X的值放入最接近X的set中, 如此类推 直到第N个元素相加最接近X的值放入set中,此时set中保存的是由单个元素到N个元素相加最接近X的值,再用set值去比较 最终返回 最最接近X的值组合,我想要的并不是一个最接近的数 ,我想要的是 所有数递归起来加起来 最接近比较值的数。假如我的集合里面有1,2,3,6,7,11,100,200,33,31 比较值是50 我想要的是33、7、6、2、1 这个组合加起来是最接近50的 当然也有别的组合 ,其实最接近比较数并且不大于比较数 那就是比较数-1了 这样就要返回 集合里面的所有等于比较值-1的组合 这个组合就是我想要的 http://topic.csdn.net/u/20110820/21/eb866f36-e1ac-4ac9-b302-b87983e9d5c3.html 欢迎大家来回帖

解决方案 »

  1.   

    这个问题有点像背包问题,由于最接近50的组合可能有多种,我在每次有结果的时候都打印了一次,最后的结果是最后打印的那个setimport java.util.ArrayList;
    import java.util.Arrays;
    import java.util.HashSet;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Set;
    public class N110821 {

    static private int dif; //当前最大组合的和
    static private Set<Integer> results = new HashSet<Integer>(); //存放结果使用
    static private int comNum; //比较数
    static private List<Integer> iLists = new ArrayList<Integer>(); //需要筛选的list
    static private int[] arr; //存放消除大于比较数后的list中的元素
    static private LinkedList<Integer> tmp = new LinkedList<Integer>(); //存放临时结果
    static boolean sign = false; /*
     * 参数:
     * 1.当前数组下标
     * 2.上一次调用后的和
     * 返回值,当前数
     */
    static void getNearestCom(int nIndex, int sum){
    for(int i = nIndex; i >= 0; ){
    i--;
    if(i >= 0 && sum + arr[i] < comNum){
    tmp.addLast(arr[i]);
    sign = true;
    getNearestCom(i, sum + arr[i]);
    }else{
    if(sign && sum >= dif){
    dif = sum;
    results.clear();
    results.addAll(tmp);
    System.out.println(results + "--------->" + dif);
    sign = false;
    }
    if(i == -1)
    {
    if(!tmp.isEmpty())
    tmp.removeLast();
    }
    }
    }
    }

    static Set search(List<Integer> lists, int max){
    comNum = max;
    //先随便找一个比这个比较数小的数初始化
    iLists.addAll(lists);
    //去掉大于比较数的数
    for(int i = 0; i < iLists.size(); i++){
    if(iLists.get(i) >= comNum){
    iLists.remove(i);
    i--;
    }
    }
    arr = new int[iLists.size()];
    for(int i = 0; i < iLists.size(); i++){
    arr[i] = iLists.get(i);
    }
    dif = arr[0]; //初始化dif
    results.add(arr[0]);
    getNearestCom(arr.length, 0);
    return results;
    }

    public static void main(String[] args) {
    List<Integer> lists = Arrays.asList(new Integer[]{1,2,3,6,7,11,100,200,33,31});
    System.out.println("最后结果是:" + N110821.search(lists, 50));
    }
    }
      

  2.   

    本帖结果了  已经采纳 shuwei003 的答案 因为发了两个一样的贴所以次贴不打算结了 谢谢大家关注