当前位置: 首页 > 知识库问答 >
问题:

在Java填充布尔数组

邢凌
2023-03-14

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

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

a) 这是最有效的方法

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

我将感谢任何和所有的反馈,即使是一个完整的代码超载!

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

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

在“位置”类中,设置“出口”如下所示:

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;
}

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

欢迎任何帮助!

共有3个答案

赵俊晤
2023-03-14

好的,首先,您的 setExits() 方法将无法按预期工作,链接的 if-elseif 将最大程度地执行 1 个代码分支,例如:

if (e.contains("N"))
    bexits[0] = true;
else if (e.contains("W"))
    bexits[1] = true;

即使e同时包含NW,也只会设置bexits[0]。此外,此方法只会添加出口(例如调用setExits("")不会删除任何现有出口。

我会将该方法更改为:

bexits[0] = e.contains("N");
bexits[1] = e.contains("W");
...

另外,我肯定不会记得北在索引0上,西在索引1上,...因此,通常的做法是使用最终的静态常量来命名索引:

public static final int NORTH = 0;
public static final int WEST = 1;
...

然后,您可以在< code>setExits方法中编写:

bexits[NORTH] = e.contains("N");
bexits[WEST] = e.contains("W");
...

(更具可读性)

最后,如果您希望代码更合理地排列,则可以创建一个 Exits 类,表示可用的出口,并由布尔数组提供支持。然后,在创建 String 的位置,可以改为创建此类,并节省自己生成然后解析字符串的工作。

编辑:

@gexicide回答说,有一个非常方便的类EnumSet,它可能比bollean数组更适合表示出口。

鄢选
2023-03-14

是否有任何理由使用Strings执行此操作并且不传入布尔值,即

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所指出的,这段代码实际上不应该工作。

孟智志
2023-03-14

最有效的表达方式如下:

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

这是你如何做到这一点:

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

Enum set将在内部将所有出口存储在一个长中,因此您的代码具有表现力,快速,并节省大量内存。

 类似资料:
  • 问题内容: 作为一个相当环保的Java程序员,我给自己设定了尝试编写简单文本冒险的艰巨挑战。毫不奇怪,我已经遇到了困难! 我试图给我的Location类一个属性来存储退出包含的属性。我为此使用了一个布尔数组,以实质上保存代表每个出口的true / false值。我并不完全相信 a) 这是最有效的方法,并且 b) 我正在使用正确的代码填充数组。 我希望收到所有反馈,即使是对完整的代码进行大修! 目前

  • Arrays 类提供了一个 fill() 方法,可以在指定位置进行数值填充。fill() 方法虽然可以填充数组,但是它的功能有限制, 只能使用同一个数值进行填充。语法如下: 其中,array 表示数组,value 表示填充的值。 例 1 声明一个 int 类型的 number 数组,然后通过 for 语句进行遍历,在该语句中调用 Arrays 类的 fill() 方法来填充数组,并输出数组中元素的

  • 问题内容: 我知道该怎么做,但是我发誓您可以像[[0] = {0,0,0,0};那样填写;你是怎么做到的?我确实尝试过Google,但没有任何帮助。 问题答案: 您也可以将其作为声明的一部分:

  • 抱歉,如果这个问题已经提出,我已经做了深入的搜索,什么都没有。 现在,我知道: 会在左边用0填充我的价格,所以25的价格会导致00025 如果我想把它们垫在右边,结果是25000呢?如何仅使用String.format模式?

  • 本文向大家介绍用Java填充字节数组,包括了用Java填充字节数组的使用技巧和注意事项,需要的朋友参考一下 可以使用java.util.Arrays.fill()方法填充Java中的字节数组。此方法将所需的字节值分配给Java中的字节数组。java.util.Arrays.fill()所需的两个参数是数组名称和要存储在数组元素中的值。 演示此的程序如下所示- 示例 输出结果 现在让我们了解上面的程

  • 问题内容: 我正在编写一个从整数n创建2D数组的程序。然后,我必须用从1到n n数组大小的 值填充数组, 并检查它是否是一个幻方。 我现在的方式是按照从1到n n数组大小的 顺序填充 数组。我该如何随机? 我的代码: 问题答案: 创建一个随机的数字列表以添加到您的数组中,如下所示: