【问题标题】:Is there a way to write this using a String array instead of an arraylist?有没有办法使用字符串数组而不是数组列表来编写它?
【发布时间】:2019-09-02 11:04:17
【问题描述】:

我正在研究排列。我找到了这个算法,但我不完全理解数组列表中发生了什么。我尝试使用字符串数组重写它,但没有成功。

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


【解决方案1】:

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

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

编辑:我是个白痴,没有阅读问题标题。虽然在技术上可以使用 String 数组重写它,但它需要我们知道可以添加到 combos 数组中的可能组合数量,以便我们可以分配适当的空间量(即 String[] combos = new String[num])。计算num 要么会很乏味,要么会为数组分配太多空间,从而耗尽不必要的内存。最好将内存管理留给 ArrayList,大部分时间都在担心手头的实际问题。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 2019-09-18
      • 2021-06-20
      • 2023-04-01
      • 2022-11-09
      相关资源
      最近更新 更多