1. Метод проверить, содержит ли массив определенное значение
Использовать список
Public Static Boolean Uselist (String [] arr, String TargetValue) {return Arrays.aslist (arr) .contains (targetValue);}Использование набора
Public Static Boolean использует (string [] arr, string targetvalue) {set <string> set = new hashset <string> (arrays.aslist (arr)); return set.contains (targetvalue);}Используйте суждение
public static boolean useloop (string [] arr, string targetvalue) {for (string s: arr) {if (s.equals (targetvalue)) return true; } вернуть false;}Используйте Arrays.binarysearch ()
Метод Arrays.binarySearch() может использоваться только для упорядоченных массивов! ! ! Если массив неупорядочен, результат будет очень странным.
Использование обнаружения, содержит ли упорядоченный массив определенное значение следующим образом:
Public Static Boolean useArraysBinarySearch (string [] arr, string targetvalue) {int a = arrays.binarysearch (arr, targetvalue); if (a> 0) вернуть true; иначе вернуть false;}Временная сложность
Следующий код может примерно нарисовать временную стоимость различных методов. Основная идея состоит в том, чтобы найти определенное значение из массива, а размеры массива составляют 5, 1K и 10K соответственно. Результаты, полученные этим методом, могут быть не точными, но являются самым простым и ясным способом.
public static void main (string [] args) {string [] arr = new String [] {"cd", "bc", "ef", "de", "ab"}; // Использование списка long startTime = system.nanotime (); for (int i = 0; i <100000; i ++) {uselist (arr, "a"); } long EndTime = System.Nanotime (); длительная продолжительность = конечное время - начало; System.out.println ("uselist:" + duration / 1000000); // Использовать SET startTime = System.Nanotime (); for (int i = 0; i <100000; i ++) {использует (arr, "a"); } endTime = System.Nanotime (); Продолжительность = конечное время - начало; System.out.println ("использует:" + продолжительность / 1000000); // Использование цикла startTime = System.Nanotime (); for (int i = 0; i <100000; i ++) {useloop (arr, "a"); } endTime = System.Nanotime (); Продолжительность = конечное время - начало; System.out.println ("useloop:" + duration / 1000000); // Использование Arrays.binarySearch () startTime = System.Nanotime (); for (int i = 0; i <100000; i ++) {useArraysBinarySearch (arr, "a"); } endTime = System.Nanotime (); Продолжительность = конечное время - начало; System.out.println ("usearraybinary:" + duration / 1000000);}Результаты работы:
Uselist: 13 USESET: 72USELOOP: 5USEARRAYSBININALSEARCH: 9
Используйте массив длины 1K
String [] arr = new String [1000]; случайный s = new random (); for (int i = 0; i <1000; i ++) {arr [i] = string.valueof (s.nextint ());}результат:
USELIST: 112USESET: 20555555seloop: 99usearraybinary: 12
Используйте массив длины 10K
String [] arr = new String [10000]; случайный s = new random (); for (int i = 0; i <10000; i ++) {arr [i] = string.valueof (s.nextint ());}результат:
USELIST: 1590USESET: 23819USELOOP: 1526USEARRayBinary: 12
краткое содержание
Очевидно, что использование простого метода цикла является более эффективным, чем использование любой коллекции. Многие разработчики используют первый метод удобства, но их эффективность также относительно низкая. Поскольку вы нажимаете массив в тип сбора, вы должны сначала пересечь элементы массива, а затем использовать класс коллекции для выполнения других операций.
Если вы используете метод Arrays.binarySearch() , массив должен быть отсортирован. Поскольку приведенный выше массив не отсортирован, этот метод недоступен.
Фактически, если вам нужно использовать массивы или классы сбора, чтобы эффективно проверить, содержит ли массив определенное значение, отсортированный список или дерево может достичь сложности времени O (log (n)), а хэшсет может достичь O (1).
Используя арарутилы
В дополнение к вышесказанному, библиотека классов Apache Commons также предоставляет класс Arrayutils, который может использовать его метод для оценки взаимосвязи между массивами и значениями.
Import org.apache.commons.lang3.arrayutils; public static boolean usearrayutils (string [] arr, string targetvalue) {return arrayutils.contains (arr, targetvalue);}Тот же тест был проведен с использованием массивов вышеуказанных длин, и в результате эффективность этого метода была между использованием наборов и использованием суждений петли (иногда результат был даже более идеальным, чем использование циклов).
USELIST: 323USESET: 3028USELOOP: 141USEARRAYBINIA
На самом деле, если вы посмотрите на исходный код Arrayutils.contains, вы можете обнаружить, что на самом деле это способ судить, включен ли элемент в массив.
Некоторые из кодов следующие:
if (array == null) {return -1; } else {if (startIndex <0) {startIndex = 0; } int i; if (objectTofind == null) {for (i = startIndex; i <array.length; ++ i) {if (array [i] == null) {return i; }}} else if (array.getClass (). getComponentType (). IsInstance (objectTofind)) {for (i = startIndex; i <array.length; ++ i) {if (objectTofind.equals (array [i])) {return i; }}} return -1; }Итак, для сравнения, я предпочитаю использовать класс инструментов Arrayutils для выполнения некоторых операций, связанных с предком объединенного числа. В конце концов, он может позволить мне меньше написать много кода (потому что при написании кода самостоятельно невозможно ошибки.
Суммировать
Хорошо, вышеупомянутое все об этой статье. Я надеюсь, что содержание этой статьи поможет всем, кто изучает или использует Java. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения.