【问题标题】:array of booleans to represent a set of integers表示一组整数的布尔数组
【发布时间】:2013-05-10 17:59:00
【问题描述】:

嘿,我想知道是否有人可以进一步解释这一点。这不是一项任务,它只是我的一个测试的解决方案。我一直在努力理解它,但我不确定..

基本上给出答案的问题是:

[i]在 Java 中编写一个名为 RangeSet 的类,它使用布尔数组的数据结构来表示一组整数,使用 3 种方法: [列表] []add - 如果项目已经是集合的成员,则添加项目但保持集合不变 []remove - 如果项目不是集合的成员,则移除项目但保持集合不变 [*]contains - 返回一个布尔值,表示一个项目是否是集合的成员 [/列表]

该类应该有一个构造函数,它接受一个整数 n 并给出一个表示一组的对象,该集合可以包含 1 到 n 范围内的整数。构造函数应该给出一个空集。该集合应该是破坏性的。如果集合被操作更改,则方法应返回 true,否则返回 false。[/i]

基本上,这里是一组限制在 1 到 n 范围内的整数,由布尔数组实现 add 和 remove 方法返回一个布尔值,表示集合是否已被调用更改,假设方法 add、remove 和 contains 的所有参数都在 1 到 n 范围内,因此没有特殊代码来处理参数不在范围内的情况。

class RangeSet
{
     private boolean[] arr;

     public RangeSet(int n)
    {
          arr = new boolean[n];
    }

     public boolean add(int n)
    {
        if(arr[n-1]) return false;
        arr[n-1]=true;
        return true;
     }

    public boolean remove(int n)
    {
        if(!arr[n-1]) return false;
        arr[n-1]=false;
        return true;
    }

     public boolean contains(int n)
     {
          return arr[n-1];
     }
}

所以我想知道,为什么 arr = new boolean[n] 和 add(int n) 都由 'n' 表示?并且解决方案不是检查新输入的整数的位置而不是检查实际值吗? 谢谢。

【问题讨论】:

  • 好吧,如果这就是您的意思,代码缺少边界检查。 n 的“超出范围”值将导致隐式 ArrayIndexOutOfBoundsException,这可能没问题,但被某些人认为是不良形式。否则,我不太明白你在问什么。

标签: java arrays boolean


【解决方案1】:

这个实现是即时的,假设您可以接受 JVM 抛出的边界检查异常,而不是自己滚动。这是完全可以接受的,因为 Java 数组总是会为您进行边界检查,因此访问数组边界之外的内容并不会出现异常是没有危险的。

里面的n

public RangeSet(int n)

n 在里面

boolean add(int n)

不相关。函数参数类似于局部变量,因为它们的名称在给定函数的范围之外没有任何意义。

还要注意,由于数组是 boolean,因此您不需要与 truefalse 进行显式比较:使用 arr[n-1]!arr[n-1] 就足够了。

【讨论】:

    【解决方案2】:

    在构造函数/方法中传递的n只在其作用域内,即add()设置的n不影响remove()

    当您从<1; n> 中获得整数时,您需要n 布尔值,如果值n 的元素已经插入,则该值将为真。这就是arr 所做的。 Java 索引数组元素从 0 而不是 1,因此是 n-1

    【讨论】:

    • 实际上即使在命令式编程中也是如此,与对象无关。
    【解决方案3】:

    n(在构造函数中)和n(在 add 方法中)是碰巧共享相同名称的两个不同的局部变量。名称可以不同,这样会更容易混淆,但考虑到变量的范围仅限于构造函数(或方法),使用相同的名称是允许且正确的。

    arr[n-1] 是存储在数组索引n-1 处的布尔值。所以,if (arr[n-1]) 等价于:

    boolean valueAtNMinusOne = arr[n-1];
    if (valueAtNMinusOne == true)
    

    但它更简洁,并且对于经验丰富的 Java 开发人员来说是可读的。

    【讨论】:

      【解决方案4】:

      n 只是一个占位符。这里发生的情况是,您的数组中有 N 个单元格,当您将数字 n(假设 n true。所以,arr[n-1](-1,因为 Java 数组是从零开始的)如果数字 n 在集合中,则包含 true,否则包含 false

      注意,如果你尝试插入 n > N,你会得到一个异常。

      【讨论】:

        【解决方案5】:

        参数名选择字母n一般表示输入的是一个数字,没有附加意义。有一个很好的论据可以将参数命名为构造函数更有意义的名称,例如max,但这并不重要。要理解的重要一点是,即使它们具有相同的名称,这些值也不会相互关联。

        如果arr[x-1] 为真,则x 是该集合的成员。否则不是。

        if 语句的条件是任何布尔值。比较很常见,但与直接使用布尔值一样有效:

        boolean flag = false; 
        //lots of code
        if (x < 0) flag = true;
        //lots more code that changes the value of x
        if (flag) {
          //do the thing for negative values
        } else {
          //do the thing for positive values
        }
        

        您的示例正在做同样的事情,但针对的是整个标志数组。

        【讨论】:

          【解决方案6】:

          在 add(n) 方法中:

          如果 arr[n-1] 设置为 true 我明白了,因为那是附加新元素的位置?

          但是它如何检查集合中是否没有给定元素,只检查最后一个位置 - (arr[n-1]) .. 这是否意味着我们只检查元素最后一个位置而不是整个数组来查找用户给定的整数是否在集合中?

          【讨论】:

            猜你喜欢
            • 2020-08-30
            • 1970-01-01
            • 1970-01-01
            • 2016-06-25
            • 2011-08-13
            • 1970-01-01
            • 2017-04-26
            • 1970-01-01
            • 2016-07-20
            相关资源
            最近更新 更多