1. Método para verificar se a matriz contém um determinado valor
Lista de uso
public static boolean uselist (string [] arr, string TargetValue) {return Arrays.asList (arr) .Contains (TargetValue);}Usando set
public static boolean useSet (string [] arr, string TargetValue) {set <string> set = new HashSet <String> (Arrays.asList (arr)); Return set.Contains (TargetValue);}Use o julgamento do loop
public static boolean useloop (string [] arr, string TargetValue) {for (string s: arr) {if (s.equals (TargetValue)) retorna true; } retornar false;}Use Arrays.BinarySearch ()
Arrays.binarySearch() só pode ser usado para matrizes ordenadas! ! ! Se a matriz não for ordenada, o resultado será muito estranho.
O uso de descobrir se uma matriz ordenada contém um determinado valor é o seguinte:
public static boolean usearraysBinarySearch (String [] arr, string TargetValue) {int a = Arrays.binarySearch (arr, TargetValue); if (a> 0) retorne true; caso contrário, retornar false;}Complexidade do tempo
O código a seguir pode obter aproximadamente o custo de tempo de vários métodos. A idéia básica é encontrar um certo valor de uma matriz, e os tamanhos da matriz são 5, 1K e 10K, respectivamente. Os resultados obtidos por esse método podem não ser precisos, mas são a maneira mais simples e clara.
public static void main (string [] args) {string [] arr = new String [] {"cd", "bc", "ef", "de", "ab"}; // usa lista long startTime = System.nanotime (); for (int i = 0; i <100000; i ++) {uselist (arr, "a"); } long endtime = System.nanotime (); longa duração = final - starttime; System.out.println ("UseList:" + Duration / 1000000); // use set startTime = System.nanotime (); for (int i = 0; i <100000; i ++) {usaTet (arr, "a"); } endtime = System.nanotime (); duração = fim de tempo - starttime; System.out.println ("usaTet:" + duração / 1000000); // use loop startTime = System.nanotime (); para (int i = 0; i <100000; i ++) {useloop (arr, "a"); } endtime = System.nanotime (); duração = fim de tempo - starttime; System.out.println ("USELOOP:" + Duração / 1000000); // use Arrays.binarySearch () startTime = System.nanotime (); for (int i = 0; i <100000; i ++) {usearraysBinarySearch (arr, "a"); } endtime = System.nanotime (); duração = fim de tempo - starttime; System.out.println ("Usearraybinary:" + Duração / 1000000);}Resultados em execução:
USELIST: 13USESET: 72USELOOP: 5USEARRAYSBINARYSEARCH: 9
Use uma variedade de comprimento 1k
String [] arr = new string [1000]; aleatória s = new Random (); para (int i = 0; i <1000; i ++) {arr [i] = string.valueof (s.NextInt ());}resultado:
Uselist: 112Useset: 2055Useloop: 99USEARRAYBINARY: 12
Use uma variedade de comprimento 10k
String [] arr = new String [10000]; aleatória s = new Random (); para (int i = 0; i <10000; i ++) {arr [i] = string.valueof (s.NextInt ());}resultado:
Uselist: 1590USEset: 23819USELOOP: 1526USEARRAYBINARY: 12
resumo
Obviamente, o uso de um método de loop simples é mais eficiente do que usar qualquer coleção. Muitos desenvolvedores usam o primeiro método para conveniência, mas sua eficiência também é relativamente baixa. Como você pressiona uma matriz no tipo de coleção, você deve primeiro atravessar os elementos da matriz e depois usar a classe de coleção para fazer outras operações.
Se você usar Arrays.binarySearch() , a matriz deve ser classificada. Como a matriz acima não é classificada, esse método não está disponível.
De fato, se você precisar usar matrizes ou classes de coleta para verificar com eficiência se a matriz contém um valor específico, uma lista ou árvore classificada pode obter uma complexidade de tempo de O (log (n)) e o hashset pode obter O (1).
Usando Arrayutils
Além disso, a biblioteca da classe Apache Commons também fornece uma classe Arrayutils, que pode usar seu método contém para julgar a relação entre matrizes e valores.
importar org.apache.commons.lang3.arrayutils; public static boolean usearrayutils (string [] arr, string TargetValue) {return Arrayutils.Contains (arr, TargetValue);}O mesmo teste foi realizado usando matrizes dos comprimentos acima, e o resultado foi que a eficiência desse método estava entre o uso de conjuntos e o uso de julgamentos de loop (às vezes o resultado era ainda mais ideal do que usar loops).
Uselist: 323USeset: 3028USELOOP: 141 Usearraybinary: 12Usearrayutils: 181 ---------- UseList: 3703USESET: 35183USELOOP: 3218USEARRAYBINÁRIOS: 14USEARRAYUTILS: 3125
De fato, se você olhar para o código -fonte do Arrayutils.Contains, poderá descobrir que é realmente uma maneira de julgar se um elemento está incluído em uma matriz.
Alguns dos códigos são os seguintes:
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;; }}} retornar -1; }Portanto, em comparação, prefiro usar a classe de ferramentas Arrayutils para executar algumas operações relacionadas ao ancestral numérico combinado. Afinal, ele pode me deixar escrever muito código menos (porque há inevitavelmente bugs ao escrever código sozinho. Afinal, a biblioteca de ferramentas de código aberto fornecido pelo Apache foi testado por inúmeros desenvolvedores) e a eficiência não é muito menor.
Resumir
OK, o acima é tudo sobre este artigo. Espero que o conteúdo deste artigo seja de ajuda para todos aprendem ou usam o Java. Se você tiver alguma dúvida, pode deixar uma mensagem para se comunicar.