casting does not work on nested list object type and returns empty lists (List<List<Integer>>)

huangapple go评论76阅读模式
英文:

casting does not work on nested list object type and returns empty lists (List<List<Integer>>)

问题

以下是已翻译的内容:

我正在做一些与回溯法相关的LeetCode挑战,特别是:https://leetcode.com/problems/permutations/

在这个问题中,我需要返回类型为 List<List<Integer>> 的结果。然而,如果我将参数接受为 List<Integer> 并在将其添加到主结果中时将其转换为 ArrayList<Integer>,那么我的 List<List<Integer>> 才会被正确地填充。

代码

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));  // 此处
    }else{
      // 这里有一些逻辑
      
    }
}

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

与下面的代码不同,下面的代码接受 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); // 此处
    }else{
      ... 这里有一些逻辑
    
    }
}

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

英文:

I'm doing some leetcode challenges related to backtracking, namely:
https://leetcode.com/problems/permutations/

Where I need to return List&lt;List&lt;Integer&gt;&gt; as the type, however my List&lt;List&lt;Integer&gt;&gt; only gets populated correctly if I accept List&lt;Integer&gt; as my parameter and I cast it to ArrayList&lt;Integer&gt; while I add it in the main result.

Code:

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

Output:
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

Versus, the code below where i accept ArrayList as the parameter

Code:

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

Output: [[],[],[],[],[],[]]

答案1

得分: 2

你的代码中没有进行类型转换,而且如果你的方法接受了一个 List<Integer> 或者一个 ArrayList<Integer> 都没有关系。

重要的是在第一个片段中,你将输入列表 tmp 的副本添加到结果中(result.add(new ArrayList<>(tmp)));然而在第二个片段中,你添加的是指向原始 tmp 列表的引用(result.add(tmp))。

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

英文:

There is no casting in your code, and it doesn't matter if your method accepts a List&lt;Integer&gt; or an ArrayList&lt;Integer&gt;.

What matters it that in the first snippet you add a copy of the input list tmp to the result (result.add(new ArrayList&lt;&gt;(tmp))) while in the second snippet you add a reference to the original tmp list (result.add(tmp)).

In the latter case, if you later make changes in the list referenced by tmp, these changes are reflected in all the elements of the result list, since they are all references to the same list object.

huangapple
  • 本文由 发表于 2020年10月6日 15:59:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/64221648.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定