Java 表示一组整数的布尔数组

Java 表示一组整数的布尔数组,java,arrays,boolean,Java,Arrays,Boolean,嘿,我想知道是否有人能进一步解释这一点。这不是一项任务,它只是我的一个测试的解决方案。我一直想弄明白,但我不确定 基本上,给出答案的问题是: [i] 用Java编写一个名为RangeSet的类,该类使用布尔数组的数据结构,用3种方法表示一组整数: [名单] []添加-添加项目,但如果该项目已经是集合的成员,则该集合保持不变 []删除-删除项目,但如果该项目不是集合的成员,则该集合保持不变 [*]contains-返回一个布尔值,该值表示项目是否为集合的成员 [/list] 类应该有一个构造函数,

嘿,我想知道是否有人能进一步解释这一点。这不是一项任务,它只是我的一个测试的解决方案。我一直想弄明白,但我不确定

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

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

类应该有一个构造函数,它接受整数n并给出一个对象,该对象表示一个集合,该集合可以包含1到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'表示?解决方案不是检查新输入的整数的位置而不是检查实际值吗?
谢谢。

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

内部的
n

public RangeSet(int n)
boolean add(int n)
n
内部

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


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

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

由于您已从
中获得整数,因此需要
n
布尔值,如果已插入value
n
元素,则布尔值将为true。这就是
arr
所做的。Java从0而不是1索引数组元素,因此
n-1

n
(在构造函数中)和
n
(在add方法中)是两个不同的局部变量,恰好共享相同的名称。名称可能会有所不同,也不会那么容易混淆,但考虑到变量的作用域仅限于构造函数(或方法),使用相同的名称是允许的,也是正确的

arr[n-1]
是存储在数组的索引
n-1
处的布尔值。因此,
如果(arr[n-1])
等于:

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

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

n
只是一个占位符。这里发生的情况是,数组中有N个单元格,当您添加数字N时,第N个单元格被设置为
true
(假设n n,您将得到一个例外。

为参数名称选择字母
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
}
boolean标志=false;
//很多代码
如果(x<0)标志=真;
//更多更改x值的代码
国际单项体育联合会(旗){
//为负值做这件事
}否则{
//为积极的价值观做事
}
您的示例也在做同样的事情,只是针对整个标志数组。

在add(n)方法中:

如果arr[n-1]设置为true,我就知道了,因为新元素将附着在这里


但是,如果只检查最后一个位置(arr[n-1]),那么如何检查集合中是否没有给定的元素呢?这是否意味着我们只检查最后一个位置的元素,而不是整个数组,以确定用户给定的整数是否在集合中
n
的“超出范围”值将导致一个隐式的ArrayIndexOutOfBoundsException,这可能还可以,但被一些人认为是糟糕的形式。否则,我无法完全理解您的要求。实际上,即使在命令式编程中也是如此,与对象无关。