Rumah  >  Artikel  >  Java  >  Bagaimana untuk melaksanakan fungsi pengisihan senarai Java

Bagaimana untuk melaksanakan fungsi pengisihan senarai Java

王林
王林ke hadapan
2023-05-02 21:40:051078semak imbas

Pelaksanaan Senarai yang ditakrifkan dalam Rangka Kerja Koleksi Java termasuk Vektor, ArrayList dan LinkedList. Koleksi ini menyediakan akses diindeks kepada kumpulan objek. Mereka menyediakan sokongan untuk menambah dan mengalih keluar elemen. Walau bagaimanapun, mereka tidak mempunyai sokongan terbina dalam untuk menyusun elemen.
Anda boleh mengisih elemen Senarai menggunakan kaedah sort() dalam kelas java.util.Collections. Anda boleh menghantar objek Senarai kepada kaedah, atau anda boleh lulus Senarai dan Pembanding. Jika elemen dalam senarai adalah semua jenis yang sama dan kelas melaksanakan antara muka Sebanding, anda boleh memanggil Collections.sort(). Jika kelas ini tidak melaksanakan Comparator, anda juga boleh menghantar Comparator kepada kaedah sort() untuk pengisihan. Jika anda tidak mahu menggunakan susunan pengisihan lalai, anda juga boleh menghantar Comparator kepada kaedah sort() untuk diisih. Jika elemen dalam senarai bukan semua jenis yang sama, anda tidak akan bertuah apabila mengisih. Melainkan anda menulis Comparator merentas kelas khusus.

Bagaimana pula dengan susunan pengisihan? Jika elemen ialah objek String, susunan isihan adalah berdasarkan pengekodan aksara, yang pada asasnya ialah nilai ASCII/Unicode bagi setiap aksara. Jika sekatan ketat adalah untuk menangani bahasa Inggeris, susunan isihan yang ditinggalkan biasanya mencukupi, kerana ia mengisih A-Z dahulu, kemudian huruf kecil a-z. Walau bagaimanapun, jika anda berurusan dengan perkataan bukan bahasa Inggeris, atau anda hanya mahu menggunakan susunan isihan yang berbeza, terdapat variasi kedua Collections.sort(). Sebagai contoh, anda ingin mengisih rentetan dalam susunan terbalik. Untuk mencapai fungsi ini, anda boleh mendapatkan Pembanding susunan terbalik melalui reverseOrder() dalam kelas Koleksi. Kemudian, anda menghantar Comparator terbalik kepada kaedah sort(). Dalam erti kata lain, anda melakukan perkara berikut:

<p>List list = ...;<br>Comparator comp = Collections.reverseOrder();<br>Collections.sort(list, comp);</p>

Jika senarai mengandungi item: Lelaki, lelaki, Wanita dan wanita, senarai yang diisih ialah Lelaki, Wanita, lelaki, wanita. Tiada yang rumit di sini. Perkara yang sangat penting untuk diambil perhatian ialah Collections.sort() melaksanakan pengisihan di tempat. Jika anda perlu mengekalkan susunan asal, anda perlu menyalin set asal dahulu dan kemudian menyusunnya, seperti ini:

<p>List list = ...;<br>List copyOfList = new ArrayList(list);<br>Collections.sort(copyOfList);</p>

Di sini, senarai yang diisih ialah: Lelaki, Wanita, lelaki, wanita, tetapi senarai asal (Lelaki, lelaki, Wanita, wanita) dikekalkan.

Setakat ini, pengisihan adalah sensitif huruf besar. Bagaimanakah anda melakukan jenis tidak peka huruf besar-besaran? Salah satu cara untuk melakukannya ialah dengan melaksanakan Comparator seperti ini:

<p>public static class CaseInsensitiveComparator <br>implements Comparator {<br>public int compare(Object element1, <br>Object element2) {<br>String lower1 = <br>element1.toString().toLowerCase();<br>String lower2 = <br>element2.toString().toLowerCase();<br>return lower1.compareTo(lower2);<br>}<br>}</p>

Anda benar-benar tidak perlu membuat kelas ini secara manual. Sebaliknya, anda boleh menggunakan Comparator sedia ada, CASE_INSENSIVTIVE_ORDER, yang ditakrifkan dalam kelas String.

Terdapat sedikit masalah dengan pelaksanaan ini. Algoritma Sort() menyediakan pengisihan yang stabil dan mengekalkan elemen yang sama seperti urutan asal. Ini bermakna senarai yang mengandungi dua elemen "wanita" dan "Wanita" akan dipesan secara berbeza, dan perbezaan ini ditentukan oleh susunan kedua-dua elemen tersebut muncul dalam senarai.

Apa yang berlaku jika bahasa berbeza? Pakej java.text menyediakan kelas Collector dan CollectionKey untuk pengisihan sensitif bahasa. Berikut ialah contoh:

Ambil perhatian bahawa jika teks anda dalam bahasa tempatan dan bukannya bahasa lalai, anda perlu menghantar bahasa tempatan kepada kaedah getInstance(), seperti:

<p>public static class CollatorComparator <br>implements Comparator {<br>Collator collator = Collator.getInstance();<br>public int compare(Object element1, <br>Object element2) {<br>CollationKey key1 = collator.getCollationKey(<br>element1.toString());<br>CollationKey key2 = collator.getCollationKey(<br>element2.toString());<br>return key1.compareTo(key2);<br>}<br>}</p>

Anda sedang mengisih kunci koleksi, bukan rentetan sebenar. Ini bukan sahaja menyediakan pengisihan tidak peka huruf besar-besaran, tetapi ia juga mengisih merentas bahasa. Dalam erti kata lain, jika anda menyusun campuran perkataan Sepanyol dan bukan Sepanyol, perkataan mañana (esok) akan diletakkan di kedudukan sebelum mantra. Jika anda tidak menggunakan Pemungut, mañana akan masuk di belakang mantra.

Atur cara berikut melaksanakan pelbagai jenis pengisihan pada senarai (lalai, sensitif huruf besar dan kecil, sensitif bahasa):

import java.awt.BorderLayout;
import java.awt.Container;
import java.io.*;
import java.text.*;
import java.util.*;
import javax.swing.*;

public class SortIt {

<p>public static class CollatorComparator <br>implements Comparator {<br>Collator collator = Collator.getInstance();<br>public int compare(Object element1, <br>Object element2) {<br>CollationKey key1 = collator.getCollationKey(<br>element1.toString());<br>CollationKey key2 = collator.getCollationKey(<br>element2.toString());<br>return key1.compareTo(key2);<br>}<br>}</p>

public static class CaseInsensitiveComparator
implements Comparator {
public int compare(Object element1,
Object element2) {
String lower1 = element1.toString().
toLowerCase();
String lower2 = element2.toString().
toLowerCase();
return lower1.compareTo(lower2);
}
}

public static void main(String args[]) {
String words[] =
{"man", "Man", "Woman", "woman",
"Manana", "manana", "ma?ana", "Ma?ana",
"Mantra", "mantra", "mantel", "Mantel"
};

// Create frame to display sortings
JFrame frame = new JFrame("Sorting");
frame.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
JTextArea textArea = new JTextArea();
JScrollPane pane = new JScrollPane(textArea);
contentPane.add(pane, BorderLayout.CENTER);

// Create buffer for output
StringWriter buffer = new StringWriter();
PrintWriter out = new PrintWriter(buffer);

// Create initial list to sort
List list = new ArrayList(Arrays.asList(words));
out.println("Original list:");
out.println(list);
out.println();

// Perform default sort
Collections.sort(list);
out.println("Default sorting:");
out.println(list);
out.println();

// Reset list
list = new ArrayList(Arrays.asList(words));

// Perform case insensitive sort
Comparator comp = new CaseInsensitiveComparator();
Collections.sort(list, comp);
out.println("Case insensitive sorting:");
out.println(list);
out.println();

// Reset list
list = new ArrayList(Arrays.asList(words));

// Perform collation sort
comp = new CollatorComparator();
Collections.sort(list, comp);
out.println("Collator sorting:");
out.println(list);
out.println();

// Fill text area and display
textArea.setText(buffer.toString());
frame.pack();
frame.show();
}
}

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan fungsi pengisihan senarai Java. 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