Страницы

Поиск по вопросам

четверг, 14 февраля 2019 г.

Лучший и быстрый вариант проверить наличие текста в массиве

Здравствуйте, не стану объяснять в чём смысл всего этого кода, и сразу приступлю к проблеме.
Если bar - ArrayList, то операция завершается за 22 секунд, С LinkedList >30 сек. Есть ли другие варианты проверять наличие значения в массиве? Производительность для меня очень важна :)
Есть код:
final long time = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { foo("test"); } final long endTime = System.currentTimeMillis(); System.out.println("Time: " + (endTime - time) + " ms");
Метод foo:
public static boolean foo(String s){ /*Всякий код*/ return bar.contains(s); }


Ответ

Используйте HashSet.
ArrayList: 14475 ms HashSet: 43 ms Sorted ArrayList: 540 ms
Код:
long time = 0;
ArrayList strings = new ArrayList(); Random rand = new Random(); for (int i = 0; i < 1000; i++) { strings.add(String.valueOf(rand.nextInt())); }
time = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { strings.contains("test"); } long endTime = System.currentTimeMillis();
System.out.println("ArrayList: " + (endTime - time) + " ms");
HashSet hashSet = new HashSet(strings); time = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { hashSet.contains("test"); } endTime = System.currentTimeMillis(); System.out.println( "HashSet:" + (endTime - time) + " ms");
Collections.sort(strings); time = System.currentTimeMillis(); for (int i = 0; i < 10000000; i++) { Collections.binarySearch(strings,"test"); } endTime = System.currentTimeMillis(); System.out.println("Sorted ArrayList:" + (endTime - time) + " ms");

Комментариев нет:

Отправить комментарий