【问题标题】:Naming the boolean elements in a Java boolean array命名 Java 布尔数组中的布尔元素
【发布时间】:2015-01-07 07:46:54
【问题描述】:

我被困在一件简单的事情上。我有一个名为“标签”的布尔数组。能够通过布尔值访问数组的每个元素对我来说很重要:

public boolean energetic, calming, happy, sad;
public boolean[] trackTags = {energetic, calming, happy, sad};

我传入并将布尔值分配给 trackTags 数组(假设为 [true, true, true, false]。因此,当我调用 trackTags[0] 时,我得到“true”。但是,当我打印“精力充沛”时 - 应该与 trackTags[0] 相同,该值始终为 false。我知道布尔值初始化为 false,但是当我在 trackTags 数组中切换某些值时对于“true”,命名元素不应该也改变吗?

第二个问题:我与布尔变量名称交互的好方法是什么?具体来说,如果我传入一个 String[] [happy, sad],然后只想切换我的 String 数组中名称对应的 boolean[] 值,这可行吗?我可以毫无问题地遍历两个数组的元素,但我显然无法将字符串与布尔值进行比较。

总而言之,有没有更好的方法来与布尔名称进行交互?我真的很困惑。

【问题讨论】:

  • 您的问题是thisthis 的混合。
  • 使用EnumSet 可能吗?
  • shouldn't the named elements change as well? 不,他们不应该。 boolean 是一个原始的 java 类型。这意味着布尔变量不存储对布尔值的引用,而是值本身。当您这样做时:{energetic, calming, happy, sad} 您将这四个布尔变量的值复制到数组中,但没有对它们的引用。所以,它们是不同的。如果您处理的是objects,而不是primitive type,那么引用不会丢失并且您的代码可以工作。

标签: java arrays


【解决方案1】:

使用 Map 的替代方法是定义一组单独的枚举。

enum tagNames = {energetic, calming, happy, sad};
boolean tags[] = new boolean[4];

然后你可以像往常一样修改你当前的布尔数组:

for(int i = 0; i < tags.length; i++){
    if (tags[i] == 1)
        trackTags[i] = true;
}

但您也可以使用枚举查找特定值:

tags[tagNames.energetic.ordinal()] //returns boolean value at [0]

*我想补充一点,由于可定制性问题,这种方法可能并不可取。一个例子是,如果你想让你的枚举引用另一个数组中从 0 偏移的元素。

【讨论】:

    【解决方案2】:

    这听起来更像是您想要Map 之类的东西。这将允许您通过将名称作为 key 映射到 value 来有效地命名值。

    示例

    Map<String, Boolean> trackTags = new HashMap<String, Boolean>();
    
    trackTags.put("energetic", false);
    

    注意

    为了更好的代码可读性,我还将名称放在一些最终字段中..

    public static final String ENERGETIC = "energetic";
    

    并像这样访问它..

    trackTags.get(ENERGETIC);
    

    这样,如果您需要更改名称,只需在一处更改,而不是在整个节目中更改。

    【讨论】:

    • 这和 Ruby 中的哈希值是一样的吗?
    【解决方案3】:

    我传入并将布尔值分配给 trackTags 数组。但是,当我打印“精力充沛”时,该值始终为假。我知道布尔值初始化为 false,但是当我将 trackTags 数组中的某些值切换为“true”时,命名元素不应该也发生变化吗?

    没有。 boolean 是一种原始类型,因此您存储的不是布尔值的引用,而是直接的布尔值。

    我与布尔变量名称交互的好方法是什么?

    你不能通过变量名来获取变量,甚至不能使用反射(不要将变量与类的字段混淆)。请改用Map&lt;String, Boolean&gt;

    【讨论】:

      猜你喜欢
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多