【问题标题】:HashSet not returning expected outputHashSet 没有返回预期的输出
【发布时间】:2021-05-06 12:01:48
【问题描述】:

我想存储唯一列表,所以我使用 HashSet。但是,我没有得到想要的输出。这是我的代码,你能告诉我出了什么问题吗?

 public List<List<Integer>> threeSum(int[] nums) {
        
        Set<List<Integer>> res = new HashSet<>();
        
        for(int i = 0; i< nums.length; i++){
            
            int target = 0-nums[i];
            Set<Integer> neg = new HashSet<>();
            
            for(int j = i+1 ; j<nums.length; j++){
                
                int rem = target - nums[j];
                if(neg.contains(nums[j])){
                    res.add(new ArrayList<>(Arrays.asList(nums[i], rem, nums[j])));
                }
                else{
                    neg.add(rem);
                }
                
            }
        }
        System.out.println(res);
        return new ArrayList<>(res);
        
    }

我的数字是[-1,0,1,2,-1,-4]。 我的输出是[[-1,2,-1],[0,1,-1],[-1,0,1]]。为什么我将[0,1,-1][-1,0,1] 都放入 res 中,因为它们都包含相同的元素。我什么只有其中之一?我该怎么办?

【问题讨论】:

  • “为什么我都得到了”,因为它们是不同的。列表只有在它们包含相同顺序的相同元素时才相等。如果您想忽略顺序,请将它们排序。
  • 谢谢@AndyTurner,有什么方法可以让我只检查没有顺序的元素吗?还有其他我错过的 DS 吗?
  • 还有其他数据结构;但是你真的需要比排序列表更复杂的东西吗?
  • 对固定长度的列表进行排序是一个固定时间的操作。它必须是,没有变量。
  • 对一个3元素列表进行排序需要3次以上的操作。

标签: java set hashset


【解决方案1】:

来自List.equals的Javadoc:

当且仅当指定对象也是一个列表,两个列表具有相同的大小,并且两个列表中所有对应的元素对都相等时,才返回 true。

因此,[0,1,-1][-1,0,1] 不相等,尽管包含相同的元素,因为它们的顺序不同。

解决这个问题的最简单方法是对列表进行排序:

res.add(Stream.of(nums[i], rem, nums[j]).sorted().collect(toList()));

【讨论】:

    【解决方案2】:

    您可以在添加到Set 之前对List 进行排序,以便它们的顺序相同。

    【讨论】:

    • 正确!我错过了重复的元素。相应地进行了编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多