在Java布尔数组中命名布尔元素

4

我遇到了一个简单的问题。我有一个名为"tags"的布尔数组。对我来说,能够通过布尔值访问数组的每个元素非常重要:

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

我向 trackTags 数组传递并分配布尔值(例如 [true, true, true, false])。所以,当我调用 trackTags[0] 时,我得到的是 “true”。但是,当我打印“energetic”时——应该与 trackTags[0] 相同——值总是为 false。我知道布尔值初始化为 false,但是当我将 trackTags 数组中的某些值转换为“true”时,命名元素不应该也跟着改变吗?
第二个问题:有没有一种好的方法让我与布尔变量名称交互?具体来说,如果我传入一个 String[] [happy, sad],然后想仅切换与我的字符串数组中名称对应的布尔值[],这可行吗?我可以轻松地循环遍历两个数组的元素,但显然我无法将字符串与布尔值进行比较。
总的来说,有没有更好的方法来处理布尔名字?我真的很困惑。

你的问题是 这个这个 的混合。 - Sotirios Delimanolis
也许可以使用 EnumSet - khelwood
3
“命名元素不应该改变吗?” 不,不应该。boolean是Java的一种基本类型。这意味着布尔变量不存储对布尔值的引用,而是存储值本身。当您创建这样的数组时:{energetic, calming, happy, sad},您将这四个布尔变量的值复制到数组中,但不包括对它们的引用。因此,它们是不同的。如果您处理的是对象而不是基本类型,则引用将不会丢失,您的代码将正常工作。 - felipeek
3个回答

11

听起来更像是你需要类似于 Map 的东西。这可以让你通过将名称作为 key 映射到一个 value 来有效地给值命名。

例子

Map<String, Boolean> trackTags = new HashMap<String, Boolean>();

trackTags.put("energetic", false);

注意

为了让代码更易读,我还会将名称放在一些final字段中。

public static final String ENERGETIC = "energetic";

并可以像这样访问它..

trackTags.get(ENERGETIC);
那样如果你需要改名字,你只需在一个地方更改,而不是到处都要改。

1
这个想法和 Ruby 中的哈希表是一样的吗? - Max Pekarsky

5
我传递并分配布尔值给trackTags数组。然而,当我打印“energetic”时,该值始终为false。我知道布尔值初始化为false,但是当我将trackTags数组中的某些值更改为“true”时,命名元素不应该也随之更改吗?
不应该。boolean是一种原始类型,因此您没有存储布尔值的引用,而是直接存储了布尔值。
有什么好方法可以与布尔变量名称交互吗?
您无法通过名称获取变量,即使使用反射也不行(不要将变量与类的字段混淆)。请改用Map。

2
使用枚举集合是使用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的元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接