布尔数组代表一组整数

时间:2013-05-10 17:59:01

标签: java arrays boolean

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

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

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

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

基本上,这里是一组限制在1到n范围内的整数,由一组布尔值实现 添加和删​​除方法返回一个布尔值,表示该集是否已被调用更改,假设方法的所有参数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'表示?并且解决方案是否检查新输入的整数的位置而不是检查实际值? 谢谢。

6 个答案:

答案 0 :(得分:4)

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

里面的n

public RangeSet(int n)

n里面的

boolean add(int n)

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

另请注意,由于数组为boolean,因此您无需与truefalse进行明确比较:使用arr[n-1]!arr[n-1]即可。< / p>

答案 1 :(得分:1)

传递给构造函数/方法的n仅在其范围内,即由n设置的add()不会影响remove()

由于你有来自<1; n>的整数,你需要n个布尔值,如果已插入值n的元素,则该值为true。这就是arr的作用。 Java索引0到1的数组元素,因此n-1

答案 2 :(得分:1)

n(在构造函数中)和n(在add方法中)是碰巧共享相同名称的两个不同的局部变量。这些名称可能会有所不同,并且会有点混乱,但鉴于变量的范围仅限于构造函数(或方法),因此允许使用相同的名称并使其正确。

arr[n-1]是存储在数组索引n-1中的布尔值。因此,if (arr[n-1])相当于:

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

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

答案 3 :(得分:1)

n只是一个占位符。这里发生的是,当你向你的集合添加数字n(假设n <= N)时,你的数组中有N个单元格,第n个单元格设置为true。因此,arr[n-1](-1因为Java数组从零开始)包含true,如果数字n在集合中,则false

请注意,如果您尝试插入n&gt; N,你会得到一个例外。

答案 4 :(得分:1)

为参数名称选择字母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
}

你的例子正在做同样的事情,但对于一整套标志。

答案 5 :(得分:0)

在add(n)方法中:

如果 arr [n-1] 设置为 true ,我会得到它,因为那是新元素的附加位置?

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