【问题标题】:Recursives, exporting info at each step递归,在每一步导出信息
【发布时间】:2015-03-10 23:28:32
【问题描述】:

我正在编写输出字符串数组的所有组合的代码。 我可以使用doCombine 方法打印一个数组,但是当将该数组添加到LinkedList 时,它会添加仅包含Ds 的数组。如何将每个数组传递给我的列表?

public LinkedList<String[]> allCombinations = new LinkedList<String[]>();

public static void main(String[] args) {
    String[] arr = {"A", "B", "C", "D"};

    Combinations c = new Combinations();

    c.combine(arr, 0);
    c.combine(arr, 1);
    c.combine(arr, 2);
    c.combine(arr, 3);
    c.combine(arr, 4);
    c.printList();

}

private void combine(String[] arr, int r) {
    String[] res = new String[r];
    doCombine(arr, res, 0, 0, r);
}

private void doCombine(String[] arr, String[] res, int currIndex, int level, int r) {
    if (level == r) {

        printArray(res);
        //Here it doesn't work
        allCombinations.add(res);
        return;
    }
    for (int i = currIndex; i < arr.length; i++) {
        res[level] = arr[i];
        doCombine(arr, res, i + 1, level + 1, r);

        if (i < arr.length - 1 && arr[i].equals(arr[i + 1])) {
            i++;
        }
    }
}

private void printArray(String[] res) {

    for (int i = 0; i < res.length; i++) {
        System.out.print(res[i] + " ");
    }
    System.out.println();
}

public void printList() {
    for (int i = 0; i < allCombinations.size(); i++) {
        printArray(allCombinations.get(i));
    }

}

【问题讨论】:

  • 请您确认所需的输出是什么?
  • 我正在尝试将每个字符串数组添加到 allCombinations 并稍后在另一个类中访问它。

标签: java arrays recursion linked-list combinations


【解决方案1】:

我假设allCombinationsList&lt;String[]&gt;(一个LinkedList)的实现。

我认为您的错误是,当您执行allCombinations.add(res) 时,您在List 中添加了对对象res 的引用,但该对象在add 之后被修改。

因此,当您在 add 之前打印 res 时,您会打印当前值,但是,在列表中,您有 N 个对同一对象 res 的引用,该对象最终是一系列“D” (打印列表时,会打印N次res的最后一个值)

添加时必须克隆列表的当前值,它将起作用:

private void doCombine(String[] arr, String[] res, int currIndex, int level, int r) {
    if (level == r) {

        printArray(res);
        //Here it doesn't work
        allCombinations.add(res.clone());
        return;
    }
    for (int i = currIndex; i < arr.length; i++) {
        res[level] = arr[i];
        doCombine(arr, res, i + 1, level + 1, r);

        if (i < arr.length - 1 && arr[i].equals(arr[i + 1])) {
            i++;
        }
    }
}

【讨论】:

  • 我从没想过。谢谢你:)你帮我省了一些麻烦,教我。再次非常感谢。
  • 非常感谢,;p 我很乐意为您提供帮助。
猜你喜欢
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
相关资源
最近更新 更多