2013-05-10 4 views
0

Эй, мне было интересно, может ли кто-нибудь объяснить это дальше. Это не задание, это просто решение одного из моих тестов, которые у меня были. Я пытался понять это, но я не уверен ..массив булевых элементов для представления набора целых чисел

В основном вопрос для ответа, данного является:

[я] Напишите класс в Java под названием RangeSet, который использует структуру данных array of boolean для представления набора целых чисел, используя 3 метода: [list] [] add - добавляет элемент, но оставляет его неизменным, если элемент уже является членом набора [] remove - удаляет элемент но оставляет значение неизменным, если элемент не является членом набора [*] содержит - возвращает логическое значение, которое указывает, является ли элемент членом набора [/ list]

должен быть один конструктор класса, который принимает целое число n и дает объект, представляющий набор, который может содержать целые числа в диапазоне от 1 до n включительно. Конструктор должен дать пустой набор. Набор должен быть разрушительным. Методы должны возвращать true, если набор был изменен с помощью операции и false, если это не так. [/ I]

В принципе, здесь он представляет собой набор целых чисел, ограниченный диапазоном от 1 до n, реализованный массивом booleans Методы добавления и удаления возвращают логическое выражение, указывающее, был ли набор изменен их вызовом, предполагается, что все аргументы методов 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]; 
    } 
} 

Так я задаюсь вопросом, как же обр = новый логический [п] и добавьте (Int N) оба представлены 'п'? И разве решение не проверяет местоположение вновь введенного целого, а не проверяет фактическое значение? Спасибо.

+0

Ну, код пропускает проверку границ, если это то, что вы имеете в виду. Значение «вне диапазона» 'n' приведет к неявному исключению ArrayIndexOutOfBoundsException, которое, возможно, ОК, но некоторые из них считаются плохими. В противном случае я не могу понять, о чем вы спрашиваете. –

ответ

4

Эта реализация является точечной, предполагая, что вы в порядке с ограничениями, проверяющими исключения, создаваемые JVM, а не начисление собственных. Это вполне приемлемо, потому что массивы Java всегда проверяют вас, поэтому нет никакой опасности доступа к чему-либо за пределами массива и не получить исключения.

n внутри

public RangeSet(int n) 

и n внутри

boolean add(int n) 

не связаны. Параметры функции аналогичны локальным переменным, в том смысле, что их имя не означает ничего вне области действия данной функции.

отметить также, что поскольку массив boolean вам не нужны явные сравнения с true или false: с помощью arr[n-1] и !arr[n-1] достаточно.

1

The n прошел в конструктор/метод только в рамках него, т.е. n устанавливается add() не влияет на remove().

Поскольку у вас есть целые числа от <1; n>, вам нужны n значения boolean, которые будут истинны, если элемент значения n уже вставлен.Вот что делает arr. Java индексирует элементы массива от 0 до 1, следовательно n-1.

+1

Фактически это справедливо даже в императивном программировании, никакого отношения к объектам. –

+0

Вы правы, я удалил эту часть. – Mateusz

1

n (в конструкторе) и n (в методе добавления) представляют собой две разные локальные переменные, которые имеют одно и то же имя. Имена могут быть разными, и это будет немного менее запутанным, но учитывая, что область действия переменной ограничивается конструктором (или методом), использование одного и того же имени разрешено и правильно.

arr[n-1] является булевым, хранящимся в индексе n-1 массива. Таким образом, if (arr[n-1]) эквивалентно:

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

но это более краткие, и читаемые для опытного разработчика Java.

1

Это n является просто заполнителем. Что здесь происходит, так это то, что у вас есть N ячеек в вашем массиве, а n-я ячейка установлена ​​на true, когда вы добавляете номер n (при условии, что n < = N) к вашему набору. Итак, arr[n-1] (-1, потому что массивы Java основаны на нуле) содержит true, если число n находится в наборе, false в противном случае.

Обратите внимание, что если вы попытаетесь вставить n> N, вы получите исключение.

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 
} 

Ваш пример делает тот же вид вещи, но и для целого ряда флагов.

0

В (п) метод добавления:

Я понимаю, если обр [п-1] устанавливается в истинной, потому что это, где будет прикреплен новый элемент?

Но как он проверяет, нет ли заданного элемента в наборе с проверкой только последней позиции - (arr [n-1]) .. Разве это не означает, что мы проверяем элемент только в последней позиции и а не весь массив, чтобы определить, находится ли заданное целое число пользователем в наборе?

+0

Предлагаю вам прочитать другие ответы. Это неверно. –

Смежные вопросы