Rumah  >  Artikel  >  Java  >  Cara menggunakan generik untuk melaksanakan pengisihan tatasusunan di Jawa

Cara menggunakan generik untuk melaksanakan pengisihan tatasusunan di Jawa

WBOY
WBOYke hadapan
2023-05-16 16:22:061023semak imbas

1. Pengecutan berurutan tatasusunan integer

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 Abstrak kaedah di atas, *** apa yang kami fikirkan ialah menggunakan rujukan Objek java untuk melaksanakan kaedah umum

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 Nampaknya rujukan Object sangat mudah, dan carian berurutan kedua boleh menggunakan float, double, String, dsb. Masalah akan timbul jika kita ingin mengkaji lebih lanjut

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 Kod di atas adalah algoritma pengisihan berurutan Jika kita ingin menulis kaedah umum, kita mesti memaksa jenis objek ditukar menjadi satu yang melaksanakan Comparable. kaedah antara muka.

JVM akan memberikan amaran apabila memproses jenis cast paksa: nyahtanda 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])            // }        }    }

Daripada ini kita dapat melihat bahawa menggunakan rujukan Objek untuk menangani masalah biasa, apabila menggunakan parameter sebenar jika Antara muka Sebanding tidak dilaksanakan, pengkompil akan membuang pengecualian masa jalan castClassException. Program sebegini tidak selamat.

3.1 Gunakan rujukan Objek untuk menyamaratakan algoritma (seperti carian berjujukan). Dengan menggunakan rujukan Objek dan nilai sasaran tatasusunan, selagi jenis data melaksanakan kaedah sama, kelas data yang hendak dibandingkan dalam algoritma mesti melaksanakan antara muka Sebanding Kini kami menggunakan generik java untuk menyelesaikan masalah ini

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);        }    }

Kaedah statik selectionSort() dalam kelas Arrays, kaedah ini berkaitan dengan jenis integer. Untuk menggunakan versi generik untuk melaksanakan algoritma ini, memandangkan dua elemen dalam tatasusunan jenis generik T[] perlu dibandingkan, jenis objek atau kelas supernya yang melepasi parameter sebenar mesti melaksanakan antara muka Sebanding.

Atas ialah kandungan terperinci Cara menggunakan generik untuk melaksanakan pengisihan tatasusunan di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam