CodeGym /Blog Java /Aleatoriu /Sortare colecții Java ()
John Squirrels
Nivel
San Francisco

Sortare colecții Java ()

Publicat în grup
Una dintre cele mai comune funcții de care avem nevoie ca dezvoltatori care se ocupă de date este sortarea - prin posibilitatea de a sorta datele noastre, ne putem optimiza algoritmii pentru a rula mult mai rapid și găsim datele de care au nevoie într-o fracțiune de timp în care acestea ar lua altfel. În lecția de astăzi, vom vorbi despre colecțiile Java sort(). Ca un experiment de gândire rapid: imaginați-vă că căutați un nume prin lista unei universități. Pot fi zeci de mii de elevi la această școală. Dacă lista care vi s-a dat nu era în ordine alfabetică, ar trebui să răsfoiți fiecare pagină și să vă uitați foarte atent pentru a vă asigura că nu ați sărit niciun nume nicăieri, până când veți găsi în sfârșit numele pe care îl căutați. Pe de altă parte, dacă lista a fost alfabetizată, nu numai că trebuie să fii mai puțin riguros în căutarea ta, dar ai putea să sari cu ușurință la secțiunea din listă cu aceeași primă literă și să continui să sari în jurul paginilor în salturi mari până când ajungi la persoana pe care o cauți. Cu cât lucrați cu mai multe date, cu atât mai important este să le utilizați cât mai eficient și eficient posibil. În acest articol, vom analiza cum să sortăm orice implementare Listă în Java (inclusiv ArrayList) folosind metoda de sortare Colecții.

Cum să sortați o ArrayList în Java folosind metoda de sortare Java Collections

Să vorbim despre metoda Java Collections.sort. Pachetul java.util conține multe utilitare și pachete utile care sunt adesea folosite de dezvoltatori, inclusiv ArrayList. Să presupunem că aveți următorul program simplu:

import java.util.*;
import java.io.*;
class Main{
     public static void main(String[] args){
          List<String> colors = new ArrayList<String>();
          colors.add("Red    ");
          colors.add("Orange");
          colors.add("Green");
          colors.add("Blue");
    }
}
Doriți să puteți imprima lista de culori, dar în ordine alfabetică. Cum ai putea face asta? Folosind java.util.Collections, sortarea este la fel de ușoară ca o singură linie:

Collections.sort(colors);
Ta-da! Lista dvs. de culori a fost acum sortată la loc. Dacă ar fi să tipăriți lista, ca atare:

System.out.println(colors);
Apoi veți obține următoarea ieșire:

[Blue, Green, Orange, Red]
Cât de ușor a fost?! Ar fi la fel de ușor să utilizați Collections.sort() pentru a sorta în ordine crescătoare o listă de numere întregi, flotanți sau orice alt tip de date simplu. Dar dacă doriți să sortați în ordine descrescătoare? Există cu siguranță cazuri în care acest lucru are sens - imaginează-ți că ai avut o listă de scoruri la teste pentru o anumită clasă și ai vrut să-ți dai seama care sunt studenții cu cele mai bune scoruri. Ar fi mult mai logic să sortați lista în ordine descrescătoare (în primul rând cele mai mari scoruri), astfel încât răspunsurile pe care le căutați să fie chiar în partea de sus. Din fericire, Collections.sort() este suprascris cu un al doilea parametru opțional, care vă permite să faceți exact acest lucru:

sort(List l, Comparator c)
Dar ce este un comparator? Ei bine, un comparator este pur și simplu o funcție care compară două intrări și returnează un număr care reprezintă intrarea care vine prima. Dacă sortați o ArrayList de tipuri de date primitive, atunci Java Collections vă oferă deja un comparator reverseOrder(). Poate fi numit astfel:

Collections.sort(colors, Collections.reverseOrder());
Acum, culorile au fost sortate invers la loc, astfel încât, dacă le-ați tipări, veți obține următoarea rezultate:

[Red, Orange, Green, Blue]

Cum să utilizați Colecții pentru a sorta tipuri de date non-primitive în Java

Până acum, ați văzut că sortarea ArrayLists de șiruri de caractere sau ints în Java folosind metoda Collections.sort() este la fel de ușoară ca o singură linie de cod. Dar, de multe ori, ArrayLists vor stoca tipuri de date non-primitive. Când lucrați cu date care au atribute mai complexe, veți dori să scrieți clase pentru a reprezenta aceste obiecte și cum vor fi comparate între ele folosind atributele lor. Pentru a explora un exemplu în acest sens, să revedem exemplul de sortare a unei liste de culori, dar de data aceasta, în loc să sortăm șiruri, vom sorta obiectele Color. Clasa noastră de bază Color ar putea arăta cam așa:

public class Color{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(String name, int red, int green, int blue){
   	this.name = name;
    	this.r = red;
   	this.g = green;
   	this.b = blue;
	}
}
Pentru a face clasa noastră Color compatibilă cu Collections.sort(), astfel încât Colecțiile să poată înțelege cum să compare și să sorteze obiectele Color, trebuie să facem două mici modificări:
  1. faceți din Color un obiect comparabil (adăugați instrumente Comparable<Object>)
  2. suprascrieți metoda compareTo din clasă (override public int compareTo(Object o))
Cu aceste modificări, clasa noastră arată acum astfel:

public class Color implements Comparable<Object>{
	private int r;
	private int g;
	private int b;
	private String name;

	Color(int red int green, int blue, String name){
    	this.r = red;
   	this.g = green;
   	this.b = blue;
   	this.name = name;
	}

	@Override
	public int compareTo(Object o) {
    	Color c = (Color) o;
    	return this.name.compareTo(c.name);
	}
}
Observați că metoda compareTo a lui Color apelează pur și simplu metoda compareTo a lui String; sortarea se va face în ordine alfabetică. Dacă am vrea să sortăm după valoarea roșie în ordine crescătoare, de exemplu, am putea înlocui instrucțiunea return cu return this.r - cr; (dacă am vrea să sortăm după valoarea verde în ordine descrescătoare, ar fi return cg - this.g;). Acum, dacă sunăm

Collections.sort(colors);
pe o ArrayList of Colors, mai degrabă decât doar șiruri, ar funcționa deoarece Collections înțelege cum să compare obiectele Color. Dacă nu doriți să faceți obiectul dvs. să implementeze Comparable<Object>, puteți, alternativ, să scrieți un comparator pentru clasa dvs. și să îl treceți în metoda cu 2 parametri Collections.sort(). Un comparator înlocuiește o metodă public int compare(Object one, Object two), iar metoda Collections.sort() o folosește pentru a compara obiectele în timpul sortării. Un exemplu de comparatori SortByName și SortByRed sunt implementați mai jos:

class SortByName implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.name.compareTo(b.name);
	}
}

class SortByRGB implements Comparator<Color>
{
	public int compare(Color a, Color b)
	{
    	return a.r - b.r;
	}
}
Cu aceasta, acum puteți suna

Collections.sort(colors, new SortByName());
fără ca clasa Color să implementeze efectiv Comparable și va funcționa în continuare. Uneori, veți vedea că acest lucru se face în linie, folosind funcții lambda. O funcție lambda este, în esență, o funcție fără nume pe care o puteți defini în linia de cod, care o numește. Sunt utile atunci când trebuie să apelați o funcție doar pentru o anumită instanță și nu doriți să definiți o funcție separată în altă parte. Comparatorul SortByName ar putea fi definit în linie, folosind o funcție lambda, astfel:

Collections.sort(colors, (a, b)-> {
          return a.name.compareTo(b.name)});
După cum probabil ați ghicit, (a, b) reprezintă parametrii funcțiilor lambda (cele două obiecte care trebuie comparate). -> înseamnă că ceea ce urmează este o definiție a funcției lambda. Cam atât! Ați văzut acum cele mai populare metode de sortare ArrayLists în Java folosind pachetul Collections.
Comentarii
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION