有没有一种方法可以使用String数组而不是arraylist来编写此代码?

时间:2019-04-11 18:10:52

标签: java arrays string arraylist permutation

我正在研究排列。我找到了这个算法,但是我不完全了解数组列表中正在发生的事情。我尝试使用String数组重写它,但未成功。

public static ArrayList<String> combinations(String nChars, int k) 
    {
        int n = nChars.length();
        ArrayList<String> combos = new ArrayList<String>();
        if (k == 0) 
        {
            combos.add("");
            return combos;
        }
        if (n < k || n == 0)
            return combos;
        String last = nChars.substring(n-1);
        combos.addAll(combinations(nChars.substring(0, n-1), k));
        for (String subCombo : combinations(nChars.substring(0, n-1), k-1)) 
            combos.add(subCombo + last);

        return combos;
    }

    public static void main(String[] args) 
    {
        String nChars = "ABCDEF";
        System.out.println(combinations(nChars, 4));
    }

2 个答案:

答案 0 :(得分:3)

提供的代码在经典的String [](字符串数组)上使用了ArrayList,因为ArrayLists具有动态大小以及方便的方法来添加,更改和删除元素,而不必担心超出数组的大小。如果您想了解更多信息,请参见ArrayLists的Java文档。

在使用普通数组替换ArrayList时出错的原因是,数组本身没有ArrayList定义的任何方法(例如combos.add(subCombo + last);)。如果要用数组替换ArrayList,则必须手动执行相应的操作。

编辑:我是个白痴,没有阅读问题标题。从技术上说,可以使用String数组重写此数组,但它需要我们知道我们可以向combos数组中添加多少种可能的组合,以便我们可以分配适当的空间量(即{{1} }。计算String[] combos = new String[num]可能很繁琐,或者会占用过多的内存,从而为阵列分配过多的空间。最好将内存管理留给ArrayList,并在大多数时候担心手头的实际问题。

答案 1 :(得分:0)

  

combos.addAll(combinations(nChars.substring(0,n-1),k));

此调用显示了数组与List接口的实现之间的主要区别

  • 首先,您可以在列表上调用方法
  • 第二,您不必担心该数据结构的大小

换句话说:要重写您的代码以使用纯数组,必须跟踪数组的当前大小以及添加新条目时的情况。您必须增加阵列的大小。通过完成ArrayList隐式为您做的所有事情:分配一个新数组,复制所有旧条目,然后最终放入要添加的新条目。