Клас BitSet

дозволяє створити бітовий вектор, розмір якого змінюється динамічно Фактично BitSet являє собою набір бітів зі значеннями true або false розміром до 232-1, причому спочатку всі біти дорівнюють false Для зберігання набору виділяється обсяг памяті, необхідний для зберігання вектора аж до старшого біта, який встановлювався або скидався в програмі – все перевищують його біти вважаються рівними false

При створенні обєкта BitSet можна явно задати початковий розмір набору або скористатися безаргументний конструктором для установки розміру за замовчуванням

public void set(int bit)

Встановлює біт в позиції bit, привласнюючи йому значення true public void clear(int bit)

Скидає біт в позиції bit, привласнюючи йому значення false public boolean get(int bit)

Повертає значення біта в позиції bit public void and(BitSet other)

Виконує операцію логічного І над даними набором і other і привласнює результат

даному набору

public void or(BitSet other)

Виконує операцію логічного АБО над даними набором і other і привласнює результат даному набору

public void xor(BitSet other)

Виконує операцію виключає логічного АБО над даними набором і other і привласнює результат даному набору

public int size()

Повертає позицію старшого біта в наборі, який може бути встановлений або скинутий без необхідності збільшення набору

public int hashCode()

Повертає хеш-код для набору, який визначається значеннями бітів Дотримуйтеся обережності і не змінюйте біти набору, поки обєкт BitSet знаходиться в хеш-таблиці, інакше він буде втрачено

public boolean equals(BitSet other)

Повертає true, якщо всі біти other збігаються з бітами в даному наборі

У наведеному нижче класі за допомогою обєкту BitSet відбувається позначка символів, що зустрічаються в рядку Обєкт можна роздрукувати і подивитися, які ж символи входять в рядок:

public class WhichChars {

private BitSet used = new BitSet()

public WhichChars(String str) {

for (int i = 0 i &lt&lt strlength() i++)

usedset (strcharAt (i)) / / Встановити біт,

/ / Відповідний символу

}

public String toString() { String desc = &quot["

int size = usedsize()

for (int i = 0 i &lt&lt size i++) {

if (usedget(i))

desc += (char)i

}

return desc + &quot]"

}

}

122 Інтерфейс Enumeration

Більшість класів-колекцій використовує інтерфейс Enumeration в якості засобу для перебору обєктів, що входять в колекцію Крім того, цей інтерфейс використовується і іншими класами, що входять до бібліотеки Java, а також у користувача програми Зазвичай при цьому створюється власний клас, який реалізує інтерфейс Enumeration і містить один або кілька методів, які повертають обєкт Enumeration Інтерфейс Enumeration оголошує два методи:

public abstract boolean hasMoreElements()

Повертає true, якщо перебір елементів перерахування ще не закінчений Метод може багаторазово викликатися між послідовними викликами nextElement

public abstract Object nextElement()

Повертає наступний елемент перерахування Виклики цього методу здійснюють послідовний перебір всіх елементів Якщо наступного елемента не існує, збуджується виключення NoSuchElemen tException

Наведемо типовий цикл, в якому Enumeration використовується для перебору елементів класу-колекції, в даному випадку – елементів хеш-таблиці:

Enumeration e = tableelements()

while (ehasMoreElements())

doSomethingWith(enextElement())

Контракт Enumeration не гарантує фіксації вихідного стану (snapshot

guarantee) Іншими словами, якщо вміст колекції змінюється під час ітерації, це може відбитися на значеннях, що повертаються методами Наприклад, якщо у реалізації nextElement використовується вміст початкової колекції, то видалення обєктів зі списку під час перебору може мати руйнівні наслідки Якщо

б початковий стан було зафіксовано, то робота з обєктами здійснювалася б у

тому вигляді, в якому вони перебували на момент створення Enumeration Ви можете розраховувати на фіксацію вихідного стану лише в тому випадку, якщо метод, який повертає обєкт Enumeration, явно це гарантує

123 Реалізація інтерфейсу

Enumeration

При розробці нових класів-колекцій може виникнути необхідність у власній реалізації Enumeration Наведений вище клас Which Chars фактично являє собою колекцію для роботи з набором символів вихідної рядка Наступний клас реалізує інтерфейс Enumeration для того, щоб повертати символи, представлені обєктом BitSet в WhichChars:

class EnumerateWhichChars implements Enumeration {

private BitSet bits

private int pos / / Наступна проверяемая позиція

private int setSize / / Кількість біт (для оптимізації)

EnumerateWhichChars(BitSet whichBits) {

bits = whichBits

setSize = whichBitssize()

pos = 0

}

public boolean hasMoreElements() {

while (pos &lt&lt setSize &amp&amp bitsget(pos))

pos++

return (pos &lt&lt setSize)

}

public Object nextElement() {

if (hasMoreElements())

return new Character((char)pos++)

else

}

}

return null

Клас перебирає біти, що входять до BitSet, і повертає обєкти Character зі значеннями символів, яким відповідають встановлені біти в обєкті BitSet Метод hasMoreElements переміщує поточну позицію до наступного отримання елементів Він написаний так, щоб його можна було багаторазово використовувати для кожного виклику nextElement

Тепер в клас WhichChars необхідно включити метод, який повертає обєкт-

перерахування:

public Enumeration characters() {

return new EnumeratrWhichChars(used)

}

Зверніть увагу: метод characters повертає обєкт класу Enumeration, а не EnumerateWhichChars Клас EnumerateWhichChars не призначений для відкритого використання, тому реалізацію перерахування можна приховати Якщо тільки ви не захочете повертати обєкт-перерахування з новими відкритими можливостями, слід приховувати тип обєкта, щоб залишити для себе можливість змінити його реалізацію за своїм розсуд

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*