WedX - журнал о программировании и компьютерных науках

Как получить доступ к элементу из TreeMap, используя индекс int?

У меня есть TreeMap, определенный как этот частный TreeMap <String,Enclavament> a_enclavaments;. Я хочу работать с каждым анклавом TreeMap, поэтому я сделал поиск, чтобы запустить на них метод, вот что я имею в виду:

for(int i = 0; i < a_enclavaments.size(); i++)
    modify(a_enclavaments.get(i));

для модификации требуются предметы из класса Enclavament. Однако, когда я начинаю, я получаю эту ошибку:

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
    at java.lang.Integer.compareTo(Unknown Source)
    at java.util.TreeMap.getEntry(Unknown Source)
    at java.util.TreeMap.get(Unknown Source)

Я не понимаю, почему. Я прочитал API-интерфейсы Java, и он говорит

get(Object key)
     Returns the value to which the specified key is mapped, or if this map contains no mapping for the key.

Разве он не должен вернуть первый, потом второй, потом третий... Анклав из TreeMap? РЕДАКТИРОВАТЬ: Может ли это быть потому, что у меня есть первый, скажем, параметр в TreeMap, установленный как строка, и он должен быть целым числом?

18.05.2014

  • Почему вы так думаете? 18.05.2014
  • Посмотрите на метод modify(), который принимает целое число, а не строку. 18.05.2014
  • TreeMap — это пара ключ-значение. 18.05.2014
  • ваш ключ является строкой, и вы передаете int... карта дерева не является упорядоченной коллекцией, поэтому вам не нужны индексы для доступа к значениям в ней. 18.05.2014
  • Вопрос в том, почему ваши данные находятся в TreeMap и вводятся с помощью String, если вы хотите затем перебирать их? Почему TreeMap и почему именно эти ключи? Если вы сможете ответить правильно, вы либо перейдете к другой структуре данных (отсортированный List?), либо будете использовать другой ключ (например, Integer, если ваши ключи разрежены), либо будете использовать простой цикл for-each для перебора карта. 18.05.2014

Ответы:


1

Map хранит значение на основе ключа . Ключ служит для определения местоположения значения внутри структуры данных Map (массив, связанный список, дерево и т. д. в зависимости от реализации Map). Зная это, Map не работает с концепцией index, только с ключом.

В этом случае вы устанавливаете значение String в качестве своего ключа, но пытаетесь получить данные, используя Integer, и исключение довольно ясно:

java.lang.ClassCastException: java.lang.String нельзя применить к java.lang.Integer

Одним из возможных решений может быть замена ключа на Integer (если возможно).

Если вы хотите/нужно перебирать значения в Map, вы можете использовать цикл for в Map#values:

for (Enclavament enclavement : a_enclavaments.values) {
    //do what you want/need
}

При использовании последнего нет необходимости менять тип ключа вашего Map.

18.05.2014
  • Парень просто хочет перебрать значения. Это простая задача, не так ли? Это, или он может использовать неправильную коллекцию для того, чего он пытается достичь. 18.05.2014
  • Да, я так и думал... Похоже, мне нужно либо изменить ключ на целое число, либо использовать метод get() со строкой? 18.05.2014
  • @p.bosch это зависит от того, чего вы пытаетесь достичь. 18.05.2014
  • Спасибо, это то, что я использовал! 18.05.2014
  • @ p.bosch +1, или вы можете использовать цикл for-each, который кажется вам нужным. 18.05.2014

  • 2

    Вы пытаетесь получить доступ к записи, которая не существует в соответствии с типом ключа вашей карты (то есть вы пытаетесь найти ключ String при передаче Integer.

    Внутри карта пытается преобразовать то, что вы передали, в качестве ключа, по которому вы ищете, чтобы он соответствовал ключу, который карта должна принимать. String не может привести к Integer, отсюда и ваше исключение.

    Похоже, вы просто хотите перебрать содержимое своей карты. Этого можно добиться с помощью entrySet() :

    for(Map.Entry<String, Enclavement> entry : a_enclavement.entrySet()) {
        modify(entry.getValue());
    }
    

    Map.Entry<K, V> — это представление каждого пар ключ-значение вашей карты для удобной итерации. Если вы хотите выполнить операцию со всеми ключами или всеми значениями вашей карты, то это будет объект, который вы хотите получить из своей карты (например, a_enclavement.entrySet()).

    18.05.2014
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]