Структури на данни в Java

В тази статия бих искал да разгледам един много тясно фокусиран и рядко използван, но доста полезен в някои случаи интерфейс NavigableSet. Интерфейсът е наследен от SortedSet и разширява методите за навигация, за да намери най-близкото съвпадение за дадената стойност. И подобно на родителския интерфейс, NavigableSet не може да има дубликати. Нека разгледаме полезността и удобството от прилагането на неговите методи на практика. Да предположим ситуация, в която имаме определен масив от дробни числа (в моя случай 6 числа след десетичната запетая), в която трябва да извършим операции за търсене на най-близките стойности.

Както можете да видите, дори в такъв малък набор от данни, където числата се различават само в хилядни, при ръчна работа сложността на работа със съществуващите данни се увеличава, което може да доведе до грешка. Методlower()– връща най-големия елемент в набора, но строго по-малък от посочения; ако няма такъв елемент, тогава ще бъде върнат null като резултат.floor()– връща най-големия елемент в набора, но по-малък или равен на указания, при липса на такъв елемент се връща null.ceiling()- връща най-близкия елемент в набора, но който е по-голям или равен на дадения, при липса на такъв елемент се връща null.higher()- връща най-близкия елемент в набора, но строго по-голям от дадения, при липса на такъв елемент се връща null. И така, нека вземем най-малкото число (n5 = 0,484554) в набора и да разгледаме поведението на тези методи при работа.

Както можете да видите, при извикване на методаlower()за най-малкото число, компилаторът върна null() поради липсата на подходящи стойности. Методътfloor()върна желаната стойностпоради липсата на елементи, по-малки от даденото, но еквивалентни на даденото число. Методитеceiling()иhigher()работеха, както е описано по-горе.

NavigableSet използва вградения итератор за достъп до всички елементи на набора един по един, изходът може да бъде направен във възходящ или низходящ ред с помощта на методитеiterator()иdescendingIterator(). Например:

В резултат на това получаваме следния резултат в конзолата:

0.884554; 0.784554; 0.755544; 0.755543; 0.755444; 0,484554

Нека създадем клас Car с имплементация на интерфейса Comparable и заместване на метода compareTo, в този случай сравнявайки по общия пробег на автомобила, за да проучим следващите методи.

В метода main() създайте NavigableSet и го попълнете с нашите коли:

Методът pollFirst() получава и премахва първия най-малък елемент от set() или връща null, ако наборът е празен. Нека стартираме този метод и да отпечатаме общия набор на конзолата.

Както можете да видите, това е автомобилът с най-малък пробег от 17000,0 и както е посочено в документацията за метода, той е премахнат от общия брой изброени превозни средства. Методът pollLast() работи точно обратното на предишния. И ако се изпълни, ще се появи на екрана. Кола

Можете също да направите промени в метода compareTo() или да създадете отделен компаратор, който ще сравнява по различен параметър и ще сортира според направените промени.

headSet() връща данни, които са по-малки или равни на дадената стойност. Например:

Искам да отбележа, че инсталираният Car3 показва по-малки елементи, според настройките на метода compareTo(), като същото правило важи и за описаните по-долу методи. tailSet() работи по същия начин, само че връщаданните са по-големи от дадената стойност. subset() ви позволява да извеждате данни според две зададени граници. Използването на SortedSet ще отпечата първата зададена стойност и всички следващи, но не и последната. С NavigableSet, изходът на first и last се контролира от true или false флагове.