Maison  >  Article  >  Java  >  Comment utiliser des génériques pour implémenter le tri de tableaux en Java

Comment utiliser des génériques pour implémenter le tri de tableaux en Java

WBOY
WBOYavant
2023-05-16 16:22:061023parcourir

1. Rétrécissement séquentiel des tableaux d'entiers

public static int seqSearch(int[] arr, int first, int last, int target) {        for (int i = first; i < last; i++)            if (arr[i] == target)                return i;            return -1;    }

1.1 En faisant abstraction de la méthode ci-dessus, ***pensons à utiliser la référence Object de Java pour implémenter la méthode universelle#🎜🎜 #

public static int seqSearch(Object[] arr, int first, int last, Object target) {        for (int i = first; i < last; i++)            if (arr[i].equals(target))                return i;            return -1;    }
#🎜🎜 #2.1 Il semble que la référence à Object soit très pratique, et la deuxième recherche séquentielle peut utiliser float, double, String, etc. Des problèmes surgiront si nous voulons étudier plus en détail

public static void selectionSort(int[] arr) {        int n = arr.length, smallIndex = 0;        for (int i = 0; i < n; i++) { // 遍历array数组            smallIndex = i;            for (int j = i + 1; j < n; j++)                if (arr[smallIndex] > arr[j]) // 选择最小的索引j                    smallIndex = j;            // if (smallIndex != i) {            exchange(arr, i, smallIndex);// 交换array[i]与 min(array[i+1,..,n])            // }        }    }

2.2 Le code ci-dessus est un algorithme de tri séquentiel Si nous voulons écrire une méthode générale, nous devons forcer la conversion du type d'objet en une implémentation comparable. Méthodes d'interface.

JVM lancera un avertissement lors du traitement du type de conversion forcée : décochez la case cast

@SuppressWarnings("unchecked")    public static void selectionSort(Object[] arr) {            int n = arr.length, smallIndex = 0;        for (int i = 0; i < n; i++) { // 遍历array数组            smallIndex = i;            for (int j = i + 1; j < n; j++)                if (((Comparable<Object>)arr[smallIndex]).compareTo(((Comparable<Object>)arr[j])) > 0) // 选择最小的索引j                    smallIndex = j;            // if (smallIndex != i) {            exchange(arr, i, smallIndex);// 交换array[i]与 min(array[i+1,..,n])            // }        }    }

De là, nous pouvons voir que l'utilisation de la référence d'objet pour traiter les problèmes courants, lorsque l'interface Comparable n'est pas implémenté lors de l'utilisation de paramètres réels, le compilateur lancera une exception d'exécution castClassException. Un tel programme est dangereux.

3.1 Utiliser la référence Objet pour généraliser un algorithme (comme la recherche séquentielle). En utilisant la référence d'objet et la valeur cible du tableau, tant que le type de données implémente la méthode égale, la classe de données à comparer dans l'algorithme doit implémenter l'interface Comparable,

Maintenant, nous utilisons des génériques Java pour résoudre ce problème problème

public static <T extends Comparable<? super T>> void selectionSort(T[] arr){        int n = arr.length;        int smallIndex;        for (int i = 0; i < n-1; i++) {            smallIndex=i;            for (int j = i+1; j < n; j++)                 if (arr[j].compareTo(arr[smallIndex])<0)                     smallIndex=j;            exchange(arr, smallIndex, i);        }    }
La méthode statique selectionSort() dans la classe Arrays, cette méthode traite les types entiers. Pour utiliser la version générique pour implémenter cet algorithme, puisque les deux éléments du tableau de type générique T[] doivent être comparés, le type d'objet ou sa superclasse qui transmet le paramètre réel doit implémenter l'interface Comparable.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer