【问题标题】:Why doesn't this "for" loop remove values from an array list? [duplicate]为什么这个“for”循环不从数组列表中删除值? [复制]
【发布时间】:2018-11-28 04:45:02
【问题描述】:

我希望以下方法删除输入的值并在成功时返回该值,但是“for”循环实际上从未删除任何值。

Integer remove(Integer value)
    {
        if (_set_array.size() == 0)
        {
            return null;
        }
        else if (value == null)
        {
            return null;
        }
        else
        {
            for (int i = _set_array.size() - 1; i >= 0; i--)
            {
                if (value == _set_array.get(i))
                {
                    _set_array.remove(i);
                    return value;
                }
            }
            return null;
        }
    }

【问题讨论】:

  • 尝试:value.equals(_set_array.get(i))

标签: java


【解决方案1】:

用这个来比较:

value.intValue() == _set_array.get(i).intValue()

这宁愿比较单个整数表示的 int 基元。

【讨论】:

    【解决方案2】:

    它对我来说很好用。你能检查一下这段代码吗?

    import java.util.ArrayList;
    import java.util.Arrays;
    
    class Main {
        public static void main(String[] args) {
            ArrayList _set_array = new ArrayList(Arrays.asList(10000, 20000, 30000, 40000, 50000));
            System.out.println(remove(30000, _set_array));
            System.out.println(_set_array);
        }
    
        static Integer remove(Integer value, ArrayList _set_array) {
            if (_set_array.size() == 0) {
                return null;
            } else if (value == null) {
                return null;
            } else {
                for (int i = _set_array.size() - 1; i >= 0; i--) {
                    if (value == (int) _set_array.get(i)) { // cast Integer to int primitive type
                        _set_array.remove(i);
                        return value;
                    }
                }
                return null;
            }
        }
    }
    

    【讨论】:

    • 因为整数是低值并且在常量池中。较大的值不会 ==
    • 我将 1,2,3,4,5 更改为 1000,2000,3000,4000,5000 并删除返回 null。建议 value.equals(_set_array.get(i))
    • @slipperyseal 同意了。因为在这里他正在比较对象类型而不是原始类型,所以它不起作用。所以他可以将值从 Interger 转换为 int 原始类型。我认为这会更好,因为他正在比较对象以外的 int 值。你有什么想法?
    • 您也可以将方法参数更改为 int 并且这些选项中的每一个都会导致自动装箱将 int 从对象中拆箱。我个人认为 value.equals(_set_array.get(i)) 在 Integer 类型上使用常规 equals 方法时,它的工作原理不太模糊
    • 为什么不使用equals
    【解决方案3】:

    您正在比较参考资料。使用intValue 方法将引用转换为原始值:

    value.intValue() == _set_array.get(i).intValue()
    

    在这里解释:https://stackoverflow.com/a/53511942/1465553

    或者,如 cmets 中所建议的,您可以使用方法 equals 来比较两个引用。

    【讨论】:

    • 有问题的代码不会报错吗?不应该在 for 循环中迭代集合时修改集合,对吧?
    • 循环从上到下,因此在删除元素时不会导致任何索引错位
    • 我肯定是在比较参考文献。将它们转换为原语后,一切都运行得完美无缺。我肯定应该刷一下掩蔽。谢谢!
    猜你喜欢
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2019-03-30
    • 2019-01-09
    • 1970-01-01
    • 2010-10-17
    • 2019-10-30
    相关资源
    最近更新 更多