在 Java 中填充布尔数组

2022-08-31 13:45:16

作为一个相当环保的Java程序员,我给自己设定了一个艰巨的挑战,试图写一个简单的文本冒险。不出所料,我已经遇到了困难!

我正在尝试为我的 Location 类提供一个属性来存储它包含的出口。为此,我使用了一个布尔数组,基本上可以保存表示每个出口的真/假值。我不完全相信

a)这是最有效的方法,并且

b)我正在使用正确的代码来填充数组。

我将不胜感激任何和所有反馈,即使它是完整的代码超程!

目前,在实例化位置时,我会生成一个字符串,并将其发送到 setExits 方法:

    String e = "N S U";
    secretRoom.setExits(e);

在 Location 类中,setExits 如下所示:

public void setExits(String e) {
    if (e.contains("N"))
        bexits[0] = true;
    else if (e.contains("W"))
        bexits[1] = true;
    else if (e.contains("S"))
        bexits[2] = true;
    else if (e.contains("E"))
        bexits[3] = true;
    else if (e.contains("U"))
        bexits[4] = true;
    else if (e.contains("D"))
        bexits[5] = true;
}

老实说,我认为这看起来特别笨拙,但我想不出另一种方法。我现在也不完全确定如何编写getExits方法...

欢迎任何帮助!


答案 1

最有效和最富有表现力的方式如下:

使用 s 作为出口,并使用 和 来存储它们。 是一种有效的实现,它使用位字段来表示枚举常量。enumEnumSetEnumSetSet

以下是您可以执行的操作:

public enum Exit { North, West, South, East, Up, Down; }

EnumSet<Exit> set = EnumSet.noneOf(Exit.class); // An empty set.

// Now you can simply add or remove exits, everything will be stored compactly

set.add(Exit.North); // Add exit
set.contains(Exit.West); // Test if an exit is present
set.remove(Exit.South); //Remove an exit

枚举集将所有出口存储在一个内部,因此您的代码富有表现力,速度快,并节省大量内存。long


答案 2

是否有任何理由让您使用s执行此操作并且不传入,即Stringbooleans

public void setExits(boolean N, boolean E, boolean S, boolean W, boolean U, boolean D) 

还是有二传手

public void setNorthOpen(boolean open)
{
  bexits[4] = open;
}

其次,为什么你把出口存储为一个布尔数组,它是一个小的有限集合,为什么不只是

boolean N,S,E,W,U,D;

这样,您就不需要跟踪每个方向的数组中的哪个数字。

这是一个正确的答案(如果不是像@gexicide那样完全最佳),但我完全鼓励任何人在这里看看其他答案,看看如何以不同的方式在Java中完成工作。

供将来参考

有效的代码属于代码审查,而不是堆栈溢出。尽管正如@kajacx指出的那样,实际上,这段代码不应该起作用。