嘿,我想知道是否有人可以进一步解释这一点。这不是一个任务,它只是我的一个测试的解决方案。我一直试图理解它,但我不确定..
基本上给出答案的问题是:
[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'表示?并且解决方案是否检查新输入的整数的位置而不是检查实际值? 谢谢。
答案 0 :(得分:4)
这个实现是定点的,假设您可以检查JVM抛出的异常,而不是自己滚动。这是完全可以接受的,因为Java数组总是会对你进行边界检查,因此没有访问数组边界之外的东西的危险,也没有异常。
里面的n
public RangeSet(int n)
和n
里面的
boolean add(int n)
没有关系。函数参数类似于局部变量,因为它们的名称在给定函数的范围之外没有任何意义。
另请注意,由于数组为boolean
,因此您无需与true
或false
进行明确比较:使用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]) ..这是否意味着我们只检查元素最后一个位置,而不是整个数组,以查找用户给定的整数是否在集合中?