0

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

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

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

该类应该有一个构造函数,它接受一个整数 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' 表示?并且解决方案不是检查新输入的整数的位置而不是检查实际值吗?谢谢你。

4

6 回答 6

4

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

n里面_

public RangeSet(int n)

n里面

boolean add(int n)

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

另请注意,由于数组 isboolean你不需要显式比较trueor false:使用arr[n-1]and!arr[n-1]就足够了。

于 2013-05-10T18:06:31.330 回答
1

传入的n构造函数/方法只在它的范围内,即nset byadd()不影响remove().

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

于 2013-05-10T18:06:43.210 回答
1

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

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

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

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

于 2013-05-10T18:07:14.297 回答
1

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

请注意,如果您尝试插入 n > N,则会出现异常。

于 2013-05-10T18:08:18.583 回答
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
}

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

于 2013-05-10T18:09:11.803 回答
0

在 add(n) 方法中:

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

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

于 2013-05-10T20:05:30.863 回答