Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Быстрый ассоциативный массив
Список форумов
 ->  Коллекции (Java Collection Framework)


 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
sergioblog : 2
Новичок

СообщениеДек 29, 2011 20:26 
Ответить с цитатой
Вопрос нубский, но беглый поиск в гугле вскрыл пару холиваров, а однозначного ответа на вопрос не дал.

Итак, есть программа, работающая с массивом классов. Классов в массиве может быть очень много, но сразу скажу, что память меня не сильно волнует. Волнует скорость.

В реалтайме происходят следующие операции:
1. Перебор всех элементов массива
2. Доступ к i-му элементу массива
3. Добавление элемента в массив (при этом индекс не важен)

Как происходит операция 3. Изначально задана константа N (максимальное число элементов), и при старте приложения создается массив размера N, в котором создается N элементов (т.е. память выделяется только один раз в самом начале). Переменная n (текущее число элементов) равна нулю. Далее если мы хотим добавить в массив элемент, мы либо инициализируем n-й элемент нужными значениями (и делаем n++), либо ищем среди n первых элементов неинициализированный и используем его. Если нам нужно удалить i-й элемент, мы не очищаем память, а помечаем его как неинициализированный.

Надеюсь, понятно написалSmile Это сделано, чтобы не выделять память в реалтайме и минимизировать частоту запуска сборщика мусора.

Пример реализации:

Код:

public class Element {

    public final static int N  = 100000;
    public static Element[] array;
    public static int n;

    public int info;
    public boolean initialized;

    public static void allocate() {
        array = new Element[N];
        for (int i = 0; i < N; i++) {
            array[i] = new Element();
        }
    }

    public static void addElement(int _info) {
        for (int i = 0; i < n; i++) {
            if (!array[i].initialized) {
                array[i].init(_info);
                return;
            }
        }
        array[n].init(_info);
        n++;
    }

    public static void iterate() {
        Element e;
        for (int i = 0; i < n; i++) {
            e = array[i];
            if (e.initialized) {
                //do something
            }
        }
    }

    public Element() {
        initialized = false;
    }

    public void init(int _info) {
        info = _info;
        initialized = true;
    }

    public void delete() {
        initialized = false;
    }
}


Массив для данной задачи хорошо подходит, поскольку:
1. операции перебора и доступа к элементу массива быстры
2. не требуется выделять и очищать память в реалтайме

Однако, необходимо определить константу N, что оставляет место для потенциальной ошибки, когда заранее невозможно предсказать сколько будет данных. Так что массив не подходит.

Отсюда вопрос, что использовать вместо массива?

Учитывая описанные условия, конечно (не требуются такие вещи, как вставка в середину, удаление и т.п.).
И аргументируйте, пожалуйста.
Заранее спасибо.
К началу Посмотреть профиль Отправить личное сообщение
pjotar : 453
Бывалый
Откуда: Санкт-Петербург

СообщениеДек 29, 2011 21:42 
Ответить с цитатой
sergioblog писал(а):

В реалтайме происходят следующие операции:
1. Перебор всех элементов массива
2. Доступ к i-му элементу массива
3. Добавление элемента в массив (при этом индекс не важен)


Это требования к структуре данных. Им удовлетворяет List. Поскольку изменяете Вы только добавлением в конец - подходит ArrayList.

Почему тема называется "Быстрый ассоциативный массив"?
К началу Посмотреть профиль Отправить личное сообщение
sergioblog : 2
Новичок

СообщениеДек 29, 2011 21:59 
Ответить с цитатой
pjotar писал(а):
подходит ArrayList

Ок, попробуем. Спасибо.

pjotar писал(а):
Почему тема называется "Быстрый ассоциативный массив"?

Не придумал как назвать по-другомуSmile
К началу Посмотреть профиль Отправить личное сообщение
sgdread : 2184
JT Библиотекарь
Откуда: USA

СообщениеДек 30, 2011 11:36 
Ответить с цитатой
Обычно ассоциативными массивами называют структуры данных, хранящих пары ключ-значение.
_________________
К началу Посмотреть профиль Отправить личное сообщение
 
Начать новую тему  Ответить на тему
Страница 1 из 1
Список форумов
 -> Коллекции (Java Collection Framework)


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru