1. Méthode pour vérifier si le tableau contient une certaine valeur
Liste d'utilisation
public static boolean uselist (String [] arr, String TargetValue) {return arrays.aslist (arr) .Contains (TargetValue);}Utilisation de l'ensemble
public static boolean useSet (string [] arr, string targetValue) {set <string> set = new hashset <string> (arrays.aslist (arr)); return set.Contains (TargetValue);}Utiliser le jugement de la boucle
public static boolean useloop (string [] arr, String TargetValue) {for (String s: arr) {if (s.equals (cibleValue)) return true; } return false;}Utilisez des arrays.binarysearch ()
Arrays.binarySearch() ne peut être utilisée que pour les tableaux commandés! ! ! Si le tableau n'est pas ordonné, le résultat sera très étrange.
L'utilisation de constater si un tableau ordonné contient une certaine valeur est le suivant:
public static boolean usearRaysBinarySearch (String [] arr, String TargetValue) {int a = arrays.binarysearch (arr, cibleValue); if (a> 0) return true; autre retour false;}Complexité temporelle
Le code suivant peut tirer à peu près le coût du temps de diverses méthodes. L'idée de base est de trouver une certaine valeur d'un tableau et les tailles du tableau sont respectivement de 5, 1k et 10k. Les résultats obtenus par cette méthode peuvent ne pas être exacts, mais sont le moyen le plus simple et le plus clair.
public static void main (string [] args) {string [] arr = new String [] {"cd", "bc", "ef", "de", "ab"}; // utilise la liste long startTime = System.NanoTime (); for (int i = 0; i <100000; i ++) {uselist (arr, "a"); } Long EndTime = System.NanoTime (); Long Durée = Fintime - StartTime; System.out.println ("UseList:" + Durée / 1000000); // utilise set startTime = System.NanoTime (); for (int i = 0; i <100000; i ++) {usetet (arr, "a"); } endtime = System.NanoTime (); Durée = Fintime - Démarrage; System.out.println ("usageT:" + Durée / 1000000); // Utiliser Loop startTime = System.NanoTime (); for (int i = 0; i <100000; i ++) {useLoop (arr, "a"); } endtime = System.NanoTime (); Durée = Fintime - Démarrage; System.out.println ("Useloop:" + Durée / 1000000); // utilise des arrays.binarysearch () startTime = System.NanoTime (); pour (int i = 0; i <100000; i ++) {usearRaysBinarySearch (arr, "a"); } endtime = System.NanoTime (); Durée = Fintime - Démarrage; System.out.println ("UseArraybinary:" + Durée / 1000000);}Résultats en cours:
USELIST: 13USESET: 72USELOOP: 5USEARRAYSBINALSEARCH: 9
Utilisez un tableau de longueur 1k
String [] arr = new String [1000]; Random S = new random (); for (int i = 0; i <1000; i ++) {arr [i] = string.valueof (s.nextint ());}résultat:
USELIST: 112USESET: 2055USELOOP: 99USEARRAYBINAL: 12
Utilisez un tableau de longueur 10k
String [] arr = new String [10000]; Random S = new random (); for (int i = 0; i <10000; i ++) {arr [i] = string.valueof (s.Nextint ());}résultat:
Uselist: 1590USEseT: 23819USELOOP: 1526USEARRAYBINAL: 12
résumé
De toute évidence, l'utilisation d'une méthode de boucle simple est plus efficace que l'utilisation d'une collection. De nombreux développeurs utilisent la première méthode de commodité, mais leur efficacité est également relativement faible. Parce que vous appuyez sur un tableau dans le type de collection, vous devez d'abord traverser les éléments du tableau, puis utiliser la classe de collection pour effectuer d'autres opérations.
Si vous utilisez Arrays.binarySearch() , le tableau doit être trié. Étant donné que le tableau ci-dessus n'est pas trié, cette méthode n'est pas disponible.
En fait, si vous avez besoin d'utiliser des tableaux ou des classes de collecte pour vérifier efficacement si le tableau contient une valeur spécifique, une liste triée ou une arborescence peut atteindre une complexité temporelle de O (log (n)) et HashSet peut réaliser O (1).
Utilisation de Arrayutils
En plus de ce qui précède, la bibliothèque de classe Apache Commons fournit également une classe ArrayUtils, qui peut utiliser sa méthode contient pour juger la relation entre les tableaux et les valeurs.
import org.apache.commons.lang3.arrayutils; public static booléen usearrayutils (string [] arr, string targetvalue) {return arrayutils.contains (arr, cibleValue);}Le même test a été effectué en utilisant des tableaux des longueurs ci-dessus, et le résultat a été que l'efficacité de cette méthode était entre l'utilisation de sets et l'utilisation de jugements de boucle (parfois le résultat était encore plus idéal que l'utilisation de boucles).
Uselist: 323USEseT: 3028USELOOP: 141USEARRAYBINAL: 12USEARRAYUTILS: 181 ---------- Uselist: 3703USEseT: 35183USELOOP: 3218USEARRAYBINAL: 14USEARRAYUTILS: 3125
En fait, si vous regardez le code source de ArrayUtils.Conds, vous pouvez constater que c'est en fait un moyen de juger si un élément est inclus dans un tableau.
Certains codes sont les suivants:
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; }Ainsi, en comparaison, je préfère utiliser la classe d'outils ArrayUtils pour effectuer certaines opérations liées à l'ancêtre combiné. Après tout, il peut me laisser écrire beaucoup de code moins (car il y a inévitablement des bogues lors de l'écriture de code par moi-même. Après tout, la bibliothèque d'outils open source fournie par Apache a été testée par d'innombrables développeurs), et l'efficacité n'est pas beaucoup plus faible.
Résumer
Ok, ce qui précède est tout sur cet article. J'espère que le contenu de cet article sera d'une aide à tout le monde pour apprendre ou utiliser Java. Si vous avez des questions, vous pouvez laisser un message pour communiquer.