Maison  >  Article  >  Java  >  Comment implémenter la fonction de tri de liste Java

Comment implémenter la fonction de tri de liste Java

王林
王林avant
2023-05-02 21:40:051078parcourir

Les implémentations de List définies dans Java Collection Framework sont Vector, ArrayList et LinkedList. Ces collections fournissent un accès indexé à des groupes d'objets. Ils prennent en charge l’ajout et la suppression d’éléments. Cependant, ils ne disposent pas de support intégré pour le tri des éléments.
Vous pouvez trier les éléments de la liste à l'aide de la méthode sort() dans la classe java.util.Collections. Vous pouvez transmettre un objet List à la méthode, ou vous pouvez transmettre un List et un Comparator. Si les éléments de la liste sont tous du même type et que la classe implémente l'interface Comparable, vous pouvez simplement appeler Collections.sort(). Si cette classe n'implémente pas Comparator, vous pouvez également transmettre un Comparator à la méthode sort() pour le tri. Si vous ne souhaitez pas utiliser l'ordre de tri par défaut, vous pouvez également transmettre un Comparator à la méthode sort() pour trier. Si les éléments de la liste ne sont pas tous du même type, vous n'aurez pas autant de chance lors du tri. Sauf si vous écrivez un comparateur inter-classes dédié.

Quel est l'ordre de tri ? Si l'élément est un objet String, l'ordre de tri est basé sur le codage des caractères, qui est essentiellement la valeur ASCII/Unicode de chaque caractère. Si la restriction stricte concerne l'anglais, l'ordre de tri omis est généralement suffisant, car il trie d'abord A-Z, puis les lettres minuscules a-z. Cependant, si vous avez affaire à des mots non anglais ou si vous souhaitez simplement utiliser un ordre de tri différent, il existe une deuxième variante de Collections.sort(). Par exemple, vous souhaitez trier les chaînes dans l'ordre inverse. Pour réaliser cette fonction, vous pouvez obtenir un comparateur d'ordre inverse via reverseOrder() dans la classe Collections. Ensuite, vous transmettez le comparateur inverse à la méthode sort(). En d'autres termes, vous procédez comme suit :

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

Si la liste contient les éléments : Homme, homme, Femme et femme, la liste triée sera Homme, Femme, homme, femme. Rien de compliqué ici. Un point très important à noter est que Collections.sort() effectue un tri sur place. Si vous devez conserver la commande originale, vous devez d'abord copier l'ensemble original, puis le trier, comme ceci :

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

Ici, la liste triée est : Homme, Femme, homme, femme , Mais la liste originale (Homme, homme, Femme, femme) est conservée.

Jusqu'à présent, le tri est sensible à la casse. Comment effectuer un tri insensible à la casse ? Une façon de le faire est d'implémenter Comparator comme ceci :

<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>

Vous n'avez vraiment pas besoin de créer cette classe manuellement. À la place, vous pouvez utiliser le comparateur existant, CASE_INSENSIVTIVE_ORDER, défini dans la classe String.

Il y a un léger problème avec cette implémentation. L'algorithme Sort() fournit un tri stable et conserve les mêmes éléments que la séquence d'origine. Cela signifie qu'une liste contenant deux éléments « femme » et « Femme » sera ordonnée différemment, et cette différence est déterminée par l'ordre dans lequel les deux éléments apparaissent dans la liste.

Que se passe-t-il si la langue est différente ? Le package java.text fournit les classes Collector et CollectionKey pour le tri en fonction de la langue. Voici l'exemple :

Notez que si votre texte est dans la langue locale au lieu de la langue par défaut, vous devez passer une langue locale à la méthode getInstance(), comme :

<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>

Vous triez sur des clés de collection, pas sur des chaînes réelles. Non seulement cela fournit un tri fixe insensible à la casse, mais il effectue également un tri entre les langues. En d’autres termes, si vous triiez un mélange de mots espagnols et non espagnols, le mot mañana (demain) serait classé avant mantra. Si vous n'utilisez pas Collector, mañana viendra derrière le mantra.

Le programme suivant effectue différents types de tri sur une liste (par défaut, sensible à la casse, sensible à la langue) :

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

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