Java 集合、数组 任意个数数字相加等于一个指定的数

一组数字 任意个数数字相加的和等于指定的数字。  比如数字集合 1,2,3, 4,5,6  ,列出所有数字相加等于6的可能性,那么结果有:1+2+3,2+4, 主要这里的结果不是数组打乱顺序相加,而是按照数组顺序取任意个数相加减,所有大家看到结果只有1+2+3而没有1+3+2或则3+2+1

step1、实体类:

static class TestDTO  {
     String id; //id
    Integer num;//数字
     public String getId() {
        return id;
     }
    public void setId(String id) {
        this.id = id;
    }
    public Integer getNum() {
        return num;
    }
 
    public void setNum(Integer num) {
        this.num = num;
    }

}

step2、实现方法:

public  static List<List<TestDTO>>  Test(List<TestDTO> dtoParam,Integer samplesNumber) {
    List<List<TestDTO>>  reust = new ArrayList<List<TestDTO>>();
    int a=1;
    int c=1;
    List<TestDTO> d=null;
    for (int i = 0; i < dtoParam.size(); i++) {
        int s =  dtoParam.get(i).getNum();
       StringBuffer   str=new StringBuffer(dtoParam.get(i).getNum()+"+");//用于控制台打印显示,和逻辑无关
        boolean bb=true;
        while(bb){
            if(bb=false){
                break;
            }
            if(dtoParam.size()==a){
                bb=false;
                break;
            }
            boolean b=true;
            while(b){
                if(dtoParam.size()==c){
                    a++;
                    b=false;
                    c=a;
                    break;
                }
                d = new ArrayList<TestDTO>();
                d.add(dtoParam.get(i));
                for(int j=c;j<dtoParam.size();j++){
                    s = s + dtoParam.get(j).getNum();
                    d.add(dtoParam.get(j));
                     str.append(dtoParam.get(j).getNum()+"+");//用于控制台打印显示,和逻辑无关
                    System.out.println(str.substring(0,str.length()-1));//用于控制台打印显示,和逻辑无关
                    if (s == samplesNumber) {
                        reust.add(d);
                        break;
                    }
                    if(dtoParam.size()-j==1){
                        s =  dtoParam.get(i).getNum();
                        str=new StringBuffer(dtoParam.get(i).getNum()+"+");//用于控制台打印显示,和逻辑无关
                        c++;
                        break;
                    }
                }
            }
        }
    }
    return  reust;
}

step3、测试方法:

 public static void main(String[] args) {
 //模拟一个数字集合
   //模拟一个数字集合
        List<TestDTO> l=new ArrayList<TestDTO>();
        for(int i=1;i<10;i++){
            TestDTO d=new TestDTO();
            d.setId(i+"");
            d.setNum(i);
            l.add(d);
        }
        List<List<TestDTO>>  list=   Test(l,6);
        for (int i=0;i<list.size();i++){
            String str="";
            for(int j=0;j<list.get(i).size();j++){
                str=str+list.get(i).get(j).getNum()+"+";
            }
            System.out.println("第"+i+"个结果:"+str.substring(0,str.length()-1));
        }

}

step4、输出结果:

控制台输出所有数字相加的情况
 
1+2
1+2+3
1+2+3+2
1+2+3+2+3
1+2+3+2+3+4
1+2+3+2+3+4+5
1+2+3+2+3+4+5+6
1+2+3+2+3+4+5+6+7
1+2+3+2+3+4+5+6+7+8
1+2+3+2+3+4+5+6+7+8+9
1+3
1+3+4
1+3+4+5
1+3+4+5+6
1+3+4+5+6+7
1+3+4+5+6+7+8
1+3+4+5+6+7+8+9
1+4
1+4+5
1+4+5+6
1+4+5+6+7
1+4+5+6+7+8
1+4+5+6+7+8+9
1+5
1+5+5
1+5+5+6
1+5+5+6+7
1+5+5+6+7+8
1+5+5+6+7+8+9
1+6
1+6+7
1+6+7+8
1+6+7+8+9
1+7
1+7+8
1+7+8+9
1+8
1+8+9
1+9
2+3
2+3+4
2+3+4+5
2+3+4+5+6
2+3+4+5+6+7
2+3+4+5+6+7+8
2+3+4+5+6+7+8+9
2+4
2+4+4
2+4+4+5
2+4+4+5+6
2+4+4+5+6+7
2+4+4+5+6+7+8
2+4+4+5+6+7+8+9
2+5
2+5+6
2+5+6+7
2+5+6+7+8
2+5+6+7+8+9
2+6
2+6+7
2+6+7+8
2+6+7+8+9
2+7
2+7+8
2+7+8+9
2+8
2+8+9
2+9
3+4
3+4+5
3+4+5+6
3+4+5+6+7
3+4+5+6+7+8
3+4+5+6+7+8+9
3+5
3+5+6
3+5+6+7
3+5+6+7+8
3+5+6+7+8+9
3+6
3+6+7
3+6+7+8
3+6+7+8+9
3+7
3+7+8
3+7+8+9
3+8
3+8+9
3+9
4+5
4+5+6
4+5+6+7
4+5+6+7+8
4+5+6+7+8+9
4+6
4+6+7
4+6+7+8
4+6+7+8+9
4+7
4+7+8
4+7+8+9
4+8
4+8+9
4+9
5+6
5+6+7
5+6+7+8
5+6+7+8+9
5+7
5+7+8
5+7+8+9
5+8
5+8+9
5+9
6+7
6+7+8
6+7+8+9
6+8
6+8+9
6+9
7+8
7+8+9
7+9
8+9
 
 
最后筛选结果:
第0个结果:1+2+3=6
第1个结果:1+5=6
第2个结果:2+4=6

猜你喜欢

转载自www.cnblogs.com/guchunchao/p/11745193.html
今日推荐