有没有办法使用String数组而不是arraylist来编写它?

问题描述 投票:-2回答:2

我正在研究排列。我找到了这个算法,但我不完全理解数组列表中发生了什么。我尝试使用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));
    }
java arrays string arraylist permutation
2个回答
3
投票

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

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

编辑:我是一个白痴,没有读过问题标题。虽然从技术上讲可以使用String数组重写它,但是我们需要知道我们可以为combos数组添加多少种可能的组合,这样我们就可以分配适当的空间量(即String[] combos = new String[num])。计算num要么繁琐,要么为阵列分配太多空间,耗尽不必要的内存量。最好将内存管理留给ArrayList,并担心大部分时间手头的实际问题。


0
投票

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

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

  • 首先,您可以在List上调用方法
  • 其次,您不必担心该数据结构的大小

换句话说:要重写代码以使用纯数组,您必须跟踪数组的当前大小,并且当您添加新条目时,您必须增加数组的大小。通过执行ArrayList为您隐式执行的所有操作:分配新数组,复制所有旧条目,然后最终添加您要添加​​的新数组。

© www.soinside.com 2019 - 2024. All rights reserved.