【问题标题】:Can't reset list after change [duplicate]更改后无法重置列表[重复]
【发布时间】:2018-08-22 16:48:05
【问题描述】:

我有 10 个元素列表,其中 1 个真和 9 个假。

我想将最后一个元素更改为 true 并将 rest 设置为 false。 我不知道为什么我的代码不起作用,在调试模式下我将所有设置为 false,但在控制台中我看到 2x true。

我的代码可能是错误的:

public class Test {

    private static boolean a = true;
    private static boolean b;
    private static boolean c;
    private static boolean d;
    private static boolean e;

    private static boolean a2;
    private static boolean b2;
    private static boolean c2;
    private static boolean d2;
    private static boolean e2;

    private static List<Boolean> listOfBooleans = new LinkedList<>();

    public static void main(String[] args) {

        listOfBooleans.add(a);
        listOfBooleans.add(b);
        listOfBooleans.add(c);
        listOfBooleans.add(d);
        listOfBooleans.add(e);
        listOfBooleans.add(a2);
        listOfBooleans.add(b2);
        listOfBooleans.add(c2);
        listOfBooleans.add(d2);
        listOfBooleans.add(e2);

        for (Boolean listOfBoolean : listOfBooleans) {
            System.out.println(listOfBoolean);
        }

        System.out.println("\n");

        setOnlyOne(9);

        for (Boolean listOfBoolean : listOfBooleans) {
            System.out.println(listOfBoolean);
        }

    }

    private static void setOnlyOne(int index){
        for (Boolean listOfBoolean : listOfBooleans) {
            listOfBoolean = false;
        }
        listOfBooleans.set(index, true);
    }

}

我应该在这里改变什么?

【问题讨论】:

  • 在 setOnlyOne 中,listOfBooleans 将为空

标签: java


【解决方案1】:

问题在于setOnlyOne 方法中的for-each 循环。它循环遍历ArrayList 的所有元素,但不更新列表的值。相反,它正在更新我们使用for-each 构造获得的本地值并将其更新为false。这样做对ArrayList 对象没有影响。

因此,您可以正常 for 循环并使用 ArrayList 的 set 方法来更新单个元素,而不是使用 for-each 循环。试试下面的代码

private static void setOnlyOne(int index) {
    for (int i = 0; i < listOfBooleans.size(); i++) {
        listOfBooleans.set(i, false);
    }
    listOfBooleans.set(index, true);
}

【讨论】:

    【解决方案2】:

    在这段代码中

    private static void setOnlyOne(int index){
            for (Boolean listOfBoolean : listOfBooleans) {
                listOfBoolean = false;
            }
            listOfBooleans.set(index, true);
        }
    

    您没有将 false 值设置为 listOfBooleans 列表的元素。 您只需将本地值设置为 false。 尝试更改您的代码:

     private static void setOnlyOne(int index){
            for (int i = 0; i < listOfBooleans.size(); i++) {
                listOfBooleans.set(i, false);
            }
            listOfBooleans.set(index, true);
        }
    

    顺便说一句。从列表 listOfBoolean 调用单个值具有误导性,因为在您的情况下它不是列表。它只是一个单一的元素。 将其命名为 singleBoolean 或类似名称。

    【讨论】:

      【解决方案3】:

      布尔值是像字符串一样的不可变对象。因此将其值更改为 false 不会更改列表中的值。当您将其更改为 false 时,它​​正在创建新对象。

      【讨论】:

      • 虽然你是对的,布尔值是不可变的,但在这种情况下并不重要。此处和您链接的问题中的效果是由Java“按值传递”引起的。如果您使用可变类型(或原始类型)而不是 Boolean 或 String,也会发生同样的情况。
      • 您可以在每个循环中更改可变对象的值。试试这个 import java.util.*;公共类测试 { public static void main(String args[]){ StringBuilder a1 = new StringBuilder("a1"); StringBuilder a2 = new StringBuilder("a2");列表列表 = 新的 ArrayList(); list.add(a1);列表.add(a2); for(对象 c : 列表) { StringBuilder sb = (StringBuilder) c; if(sb.toString().equals("a1")) sb.append("test"); } System.out.println(list); }}
      • “您可以在每个循环中更改可变对象的值。” 不,您不能,您发布的代码 sn-p 也不会这样做。您需要注意将对象引用分配给变量(在这个问题中就是这种情况)和 mutating 对象(您发布的代码的作用)之间的区别。这些是不同的东西,有不同的规则。
      • 谢谢。我在考虑只修改对象。
      猜你喜欢
      • 1970-01-01
      • 2015-05-10
      • 2017-05-27
      • 2016-06-16
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      相关资源
      最近更新 更多