2015-02-17 3 views
1

Предположим, у нас есть массив объектов, и я хочу, чтобы найти индекс конкретного объекта в списке, в общем, я хотел бы использовать методПоиск по индексу элемента в массиве

public static int findIndex(Object[] arr, Object o) { 
    int index = -1; 
    for (int i = 0; i < arr.length; i++) { 
     if (arr[i].equals(o)) { 
      index = i; 
      break; 
     } 
    } 
    return index; 
} 

Однако , существует ли более быстрый способ сделать это только с помощью пакета java.lang?

+0

что вы имеете в виду более эффективным способом? что эффективно для вас? есть ленивая оценка в Java 8, но когда я скамейка отметил это своим подходом, ваш подход был быстрее. –

+0

Позвольте мне перефразировать: метод, который работает быстрее, чем выше! Спасибо – user3749872

+0

Ищите findfirst в Java 8 и сравните его с вашим подходом, вы видите, что ваш быстрее, насколько я тестировал –

ответ

2

Если вы что-нибудь о порядке данных не знаю, не существует более эффективный алгоритм, это теоретический оптимальный. Вы можете - используя некоторые трюки - сделать это на несколько процентов быстрее. Например:

  • кэш длина массива
  • выполнить немедленное возвращение вместо того, чтобы break (разрывы, когда дело доходит до исполнения, не считаются эффективными, что).
  • Использовать o.equals вместо arr[i].equals. Умные компиляторы могут кэшировать vtableo.

Но, скорее всего, компилятор уже может получить некоторые из самих оптимизаций.

более эффективный алгоритм, таким образом, вероятно:

public static int findIndex(Object[] arr, Object o) { 
    int n = arr.length; 
    for (int i = 0; i < n; i++) { 
     if (o.equals(arr[i])) { 
      return i; 
     } 
    } 
    return -1; 
} 

Хотя разница не будет столь огромным. Если один tests обеих реализаций, разница:

//question first 
findIndex (question): 4s 209 469 827 
findIndex (answer): 4s 078 955 465 
//answer first 
findIndex (question): 4s 256 345 171 
findIndex (answer): 4s 488 112 895 

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

Если, однако, данные приказал (по некоторым отношениям) вы можете выполнить binary search.

Если вы хотите выполнить несколько поисков, вы можете сначала вставить элементы в HashSet<T>. У этого HashSet<T> есть средний взгляд на O (1) (с учетом хорошей хэширования).

+1

Говоря о HashSet, также стоит упомянуть, что достаточно прочные и эффективные структуры хэш-таблиц могут быть легко разработаны без использования каких-либо других пакетов, кроме java.lang, если скорость является такой серьезной проблемой. Одним из таких примеров является [SeparateChainingST] (http://algs4.cs.princeton.edu/34hash/SeparateChainingHashST.java.html) из * Алгоритмы * 4-е издание. Он импортирует пакет LinkedList, но только как ленивое средство возврата набора ключей в качестве итерабельного. Вы можете легко создать собственную минималистскую общую очередь, которая реализует итерируемый интерфейс. – Dyndrilliac

1

Если вы ищете эффективность в процессорном времени, это так же хорошо, как и получается. Если вы ищете меньшее количество строк коды вы можете попробовать

theIndex = Arrays.asList(arr).indexOf(o); 

или аналогичный ...

-1

Вы можете использовать одну строку кода, как указано выше. Вот некоторая информация.

Array.indexOf()

http://www.tutorialspoint.com/java/java_string_indexof.htm

+1

OP хочет искать массив, а не String. Эта ссылка ничего не говорит о том, какой подход использовался и как использовать его с массивами. – Pshemo

+0

@Pshemo Извините, я читал слишком быстро. – Eric

Смежные вопросы