【问题标题】:casting does not work on nested list object type and returns empty lists (List<List<Integer>>)强制转换不适用于嵌套列表对象类型并返回空列表 (List<List<Integer>>)
【发布时间】:2020-10-06 07:59:55
【问题描述】:

我正在做一些与回溯相关的 leetcode 挑战,即: https://leetcode.com/problems/permutations/

我需要返回 List&lt;List&lt;Integer&gt;&gt; 作为类型,但是我的 List&lt;List&lt;Integer&gt;&gt; 只有在我接受 List&lt;Integer&gt; 作为我的参数并且我将其转换为 ArrayList&lt;Integer&gt; 时才能正确填充,同时我将它添加到主要结果中。

代码

    List<List<Integer>> result = new ArrayList<>();
    public List<List<Integer>> permute(int[] nums) {
        bt(new ArrayList<Integer>(), nums);
        return result;
    }
    
    public void bt(List<Integer> tmp, int[] nums){
        if(tmp.size() == nums.length){
            result.add(new ArrayList<>(tmp));  // HERE
        }else{
          // some logic here
            
        }
    }

输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

Versus,下面的代码我接受 ArrayList 作为参数

代码:

List<List<Integer>> result = new ArrayList<>();   
public List<List<Integer>> permute(int[] nums) {
    bt(new ArrayList<Integer>(), nums);
    return result;
}
public void bt(ArrayList<Integer> tmp, int[] nums){
    if(tmp.size() == nums.length){
        result.add(tmp); // HERE
    }else{
      ... some logic here
    
    }
}

输出: [[],[],[],[],[],[]]

【问题讨论】:

  • ArrayList是类型引用,所以这里必须使用new ArrayList&lt;&gt;(tmp),否则tmp的值会在每次递归中发生变化

标签: java list arraylist casting


【解决方案1】:

您的代码中没有强制转换,无论您的方法接受 List&lt;Integer&gt; 还是 ArrayList&lt;Integer&gt; 都没有关系。

重要的是,在第一个 sn-p 中,您将输入列表 tmp 的副本添加到结果 (result.add(new ArrayList&lt;&gt;(tmp))),而在第二个 sn-p 中,您添加对原始 tmp 列表的引用(result.add(tmp))。

在后一种情况下,如果您稍后在tmp 引用的列表中进行更改,这些更改将反映在result 列表的所有元素中,因为它们都是对同一个列表对象的引用。

【讨论】:

    猜你喜欢
    • 2015-11-03
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多