Map
не заказано
У реализации Map
нет заказа. Вы просите получить запись карты по порядковому номеру, например третьему или пятому. Это не имеет смысла в контексте карты. в Map
нет такой вещи, как «третья запись» . Вы можете сделать это с List
, но не с Map
.
. Некоторые карты имеют концепцию порядка итераций ключей. Большинство реализаций, связанных с Java 11, не поддерживают это, но некоторые поддерживают.
- Несколько имплантаций реализуют интерфейс
NavigableMap
и его предшественник, SortedMap
интерфейс. Итерации выполняются по естественному порядку клавиш или по Compatator
, который вы передаете. TreeMap
ConcurrentSkipListMap
LinkedHashMap
повторяет записи в том порядке, в котором они были первоначально вставлены. EnumMap
выполняет итерации записей в том порядке, в котором ключ был определен в его классе, в его Enum
подклассе.
Но ни один из них не поддерживает доступ по порядковому номеру или индексу. Вы можете получить первую или последнюю запись. Для других позиций между первым / самым низким и последним / самым высоким вы должны выполнить итерацию.
Вот таблица с характеристиками 10 реализаций Map
в комплекте с Java 11. Обратите внимание на столбец итерационный порядок .
Обходной путь: Map::keySet
> List
> Collections.sort
> List::get
> Map::get
Для достижения sh вашей цели, возможно, вы могли бы позвонить keySet
, чтобы получить Set
ключевых объектов. Затем составьте список тех, кто вам нравится. Представьте этот список в вашем пользовательском интерфейсе. Когда пользователь запрашивает пятый элемент, извлеките его из списка по индексу (5-1), чтобы иметь ключ под рукой. Затем go к вашей карте и вызовите get
для значения, сохраненного для этого конкретного ключа.
Что-то вроде этого примера кода.
Map < Person, String > personToProjectMap = new HashMap <>( 5 );
personToProjectMap.put( new Person( "Carol" , "Connelly" ) , "Inventory Report" );
personToProjectMap.put( new Person( "Alice" , "Anderson" ) , "Sales Report" );
personToProjectMap.put( new Person( "Bob" , "Barker" ) , "Staff Report" );
personToProjectMap.put( new Person( "Edith" , "Enders" ) , "Marketing Report" );
personToProjectMap.put( new Person( "David" , "Dount" ) , "Investment Report" );
System.out.println( "DEBUG map size: " + personToProjectMap.size() );
System.out.println( "DEBUG personToProjectMap.toString() = " + personToProjectMap );
Set < Person > persons = personToProjectMap.keySet();
List < Person > personsList = new ArrayList <>( persons ); // Populate a `List` by feeding the items from our `Set`.
Collections.sort( // Use the `Collections` utility class to sort our `List` by first name of each person used as a key in our map.
personsList ,
Comparator.comparing( ( Person person ) -> person.getGivenName() )
);
System.out.println( "DEBUG personsList.toString() = " + personsList );
// Present this list to the user in user-interface.
System.out.println( "Enter the number of the entry to remove." );
int nthPerson = 0;
for ( Person person : personsList )
{
nthPerson++;
System.out.println( "№ " + nthPerson + " " + person.getGivenName() + " ➙ " + personToProjectMap.get( person ) );
}
// …
int input = 3; // … user enters 3
int index = ( input - 1 );
Person personPicked = personsList.get( index ); // Annoying zero-based counting for index.
personToProjectMap.remove( personPicked ); // Remove entry for the person picked by user.
System.out.println( "DEBUG map size: " + personToProjectMap.size() );
System.out.println( "DEBUG Result of deleting item from map:" );
System.out.println( personToProjectMap.toString() );
При запуске.
Размер карты отладки: 5
ОТЛАДКА personToProjectMap.toString () = {Person {данное имя = 'Боб' | surname = 'Barker'} = Отчет персонала, Person {данное имя = 'Edith' | surname = 'Enders'} = Маркетинговый отчет, Person {GivenName = 'Carol' | surname = 'Connelly'} = Отчет об инвентаризации, Person {данноеName = 'Алиса' | surname = 'Anderson'} = Отчет о продажах, Person {данноеName = 'David' | surname = 'Dount'} = Отчет об инвестициях}
DEBUG peopleList.toString () = [Person {данноеName = 'Алиса' | фамилия = 'Андерсон'}, Персона {данное имя = 'Боб' | фамилия = 'Баркер'}, Персона {данное имя = 'Кэрол' | фамилия = 'Коннелли'}, Персона {данное имя = 'Дэвид' | фамилия = 'Dount'}, Персона {данное имя = 'Эдит' | surname = 'Enders'}]
Введите номер удаляемой записи.
№ 1 Алиса Report Отчет о продажах
№ 2 Боб ➙ Отчет персонала
№ 3 Carol Report Инвентарный отчет
№ 4 David ➙ Инвестиционный отчет
№ 5 Edith ➙ Маркетинговый отчет
Размер карты отладки: 4
ОТЛАДКА Результат удаления элемента с карты:
{Person {GivenName = 'Bob' | surname = 'Barker'} = Отчет о персонале, Person {GivenName = 'Edith' | surname = 'Enders'} = Маркетинговый отчет, Person {данноеName = 'Алиса' | surname = 'Anderson'} = Отчет о продажах, Person {данноеName = 'David' | surname = 'Dount'} = Отчет об инвестициях}