HashSet вместо недостатка ArrayList в производительности - PullRequest
0 голосов
/ 06 декабря 2018

Для одного из моих проектов я использовал ArrayList<ArrayList<Integer>> в качестве структуры данных графика.

Итак, график:

enter image description here

будет эквивалентно списку списков ниже:

enter image description here

Но я изменил свою структуру данных с ArrayList<ArrayList<Integer>> на Map<Integer, Set<Integer>>,поэтому тот же самый график выше теперь будет эквивалентен карте:

enter image description here

Одна из причин, по которой я выбрал Set, заключается в том, что каждый списокдолжен содержать только уникальные элементы.

Выбор Map был сделан для простоты манипулирования структурой данных.

Проблема в том, что когда я изменил структуру данных, производительность снизилась почтив 2 раза.

Вот наиболее часто используемые операции в моем проекте:

В первой реализации:

int index = someIndex();
int v1 = listoflists.get(index).get(0);
int v2 = listoflists.get(index).get(1);

Во второй реализации:

int index = somIndex();
Set<Integer> sets = map.get(index);
Integer[] set =  sets.toArray(new Integer[sets.size()]);
int v1 = set[0];
int v2 = set[1];

Иногда мне нужно получить один, два или максимум три элемента.

Любая идея улучшить производительность второй реализации

1 Ответ

0 голосов
/ 06 декабря 2018
Integer[] set =  sets.toArray(new Integer[sets.size()]);

Приведенная выше строка кода добавляет дополнительную сложность.Оптимизируйте его, используя Iterator,

int index = somIndex();
Set<Integer> sets = map.get(index);
Iterator iterator = sets.iterator(); 

while (iterator.hasNext()) { 
   System.out.println(iterator.next()); 
}

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

...