(Java)如何删除可能的总和计算中的重复项?

时间:2018-04-04 19:09:25

标签: java recursion

import java.util.ArrayList;

public class Testing {
    public static void main(String[] args) {
        ArrayList<Double> valid = new ArrayList<Double>();
        ArrayList<Double> result = new ArrayList<Double>();
        valid.add(0.05);
        valid.add(0.05);
        valid.add(0.1);
        getSum(valid, result, 0, 0);
        System.out.println(result);
    }

    public static void getSum(ArrayList<Double> valid, ArrayList<Double> result, int start, double sum) {
        if (valid.size() == start) {
            result.add(sum);
            return;
        }

        double value = sum + valid.get(start);

        getSum(valid, result, start + 1, value);
        getSum(valid, result, start + 1, sum);
    }
}

我甚至不想将重复项输入到结果arrayList中,因为删除重复项会导致内存不足,因为结果arrayList太快太快了。我该怎么做?

3 个答案:

答案 0 :(得分:0)

使用接口可提供更强的代码通用性, 在java 8中,您可以使用stream和method distinct():

List<Double> valid = new ArrayList<>();
valid.add(0.05);
valid.add(0.05);
valid.add(0.1);
List<Double> removedDuplicates = valid.stream().distinct().collect(Collectors.toList());

答案 1 :(得分:0)

我最终使用了一个集合而不是像Kon和Sam_ferree建议的ArrayList。最终工作:

import java.util.ArrayList;
import java.util.Set;
import java.util.TreeSet;

public class Testing {
    public static void main(String[] args) {
        ArrayList<Double> valid = new ArrayList<Double>();
        Set<Double> result = new TreeSet<Double>();
        valid.add(0.05);
        valid.add(0.05);
        getSum(valid, result, 0, 0);
        System.out.println(result);
    }

    public static void getSum(ArrayList<Double> valid, Set<Double> result, int start, double sum) {
        if (valid.size() == start) {
            result.add(sum);
            return;
        }

        double value = sum + valid.get(start);

        getSum(valid, result, start + 1, value);
        getSum(valid, result, start + 1, sum);
    }
}

答案 2 :(得分:-1)

使用Set而不是List,如HashSet或TreeSet

根据定义设置不允许重复,因此更改该数据类型是您的代码所需的唯一更改。