Использовать фиктивный Entry
объект в качестве критерия
Предполагая, что ваша реализация Entry
для метода compareTo
, требуемого интерфейсом Comparable
, просто подчиняется содержащемуся в нем String
методу compareTo
объекта и игнорирует состояние TreeSet
номеров строк…
Просто создайте фиктивный объект Entry
с вашей целевой строкой. Используйте этот объект Entry
только для Collections.binarySearch
, затем отбросьте.
Entry target = new Entry( "Widget" , new TreeSet<Integer>() ) ;
int index = Collections.binarySearch( myList , target ) ; // Assuming the `compareTo` method compares only the `String` member field while ignoring the `TreeSet` member field.
if( entry < 0 ) { … no entry yet exists … }
else // Else, entry found to exist.
{
Entry entry = myList.get( index ) ;
…
}
…
// As `target` goes out of scope, the object becomes a candidate for garbage collection, to be deleted from memory eventually.
Чтобы быстрее отправить объект target
в сборку мусора, переназначьте target = null ;
после двоичного поиска .
Используйте Map
вместо Entry
class
Если ваш Entry
класс - это не что иное, как String
и TreeSet
, то я предлагаю вам пропустить определение этого класс вообще. Вместо этого используйте Map
. Ключ - String
для слова (слов) записи указателя, а значение - TreeSet
.
Map< String , TreeSet< Integer > > entries = new TreeMap<>() ;
Для поиска записи используйте Map::containsKey
и передать слово (слова) записи указателя.
Поведение Multimap
Затем вы можете использовать метод Java 8 computeIfAbsent
, чтобы получить удобное поведение multimap для легкого доступа к набору номера строк. Продемонстрировано на этом ответе .
Или используйте стороннюю реализацию с несколькими картами. Например, Google Guava библиотека