Список Java с пустым разрешением - PullRequest
1 голос
/ 01 марта 2009

Это, наверное, очень просто, но я действительно не мог правильно сказать это в Google. У меня есть ArrayList, который хранит информацию для каждого потока. Каждый поток имеет свой собственный идентификатор. Итак, в начале:

myList.add(theIdOfTheThread, new InfoForTheThread()); //Add new thread info at index theIdOfTheThread

А когда мне нужна информация:

myList.get(myId); //The info for the thread

Но я всегда получаю OutOfRangeExceptions всякий раз, когда нижний поток завершает работу и удаляет свою запись и т. Д. Итак, я уверен, что для этого должен быть лучший класс, где я могу просто поместить записи в любой индекс, который я хочу, и вытащить их на любой индекс, который я хочу, и они останутся.

Ответы [ 2 ]

9 голосов
/ 01 марта 2009

Для такого доступа вы действительно должны использовать массив или, что лучше, HashMap. Использование списка для этого очень неэффективно и излишне сложно. Если вы удаляете элемент из середины списка, все будет двигаться вниз, а все индексы выше того, что вы удалили, потребуют перемещения вниз.

Массив InfoForTheThread не пострадает от этого, но вам нужно знать размер массива, который вам понадобится, прежде чем начать.

Вместо этого используйте HashMap - вы можете использовать целые числа для ключей, и удаление не приведет к повторному упорядочению.

HashMap<Integer,InfoForTheThread> myInfos = new HashMap<Integer,InfoForTheThread>( 10 );

Добавление, получение и удаление записи:

myInfos.put( Integer.valueOf( 4 ), new InfoForTheThread() );
InfoForTheThread infoForFour = myInfos.get( Integer.valueOf( 4 ) );
InfoForTheThread infoForFour = myInfos.remove( Integer.valueOf( 4 ) );
3 голосов
/ 01 марта 2009

Попробуйте хеш-таблицу. Вы можете использовать идентификатор потока в качестве ключа, а затем вставить свою информацию в качестве значений.

...