Ce face Arrays.binarySearch
Căutarea binară împarte array-ul în jumătăți și continuă doar în cea care poate conține valoarea; pentru un milion de elemente sunt de ajuns cam 20 de pași. Array-ul trebuie să fie sortat crescător (sau după același comparator) — altfel rezultatul nu are sens.
Dacă valoarea există, primești poziția ei (dacă apare de mai multe ori, oricare dintre poziții). Dacă nu, primești -(punctInserare) - 1; poziția unde s-ar insera este -rezultat - 1.
Parametri
| Parametru | Descriere |
|---|---|
a |
Array-ul sortat. |
key |
Valoarea căutată. |
from, to |
Porțiunea în care se caută. |
c |
Comparatorul cu care a fost sortat array-ul. |
Ce returnează
Poziția (≥ 0) sau -(punctInserare) - 1.
Exemple
Exemplul 1: Este codul poștal în listă?
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] coduri = {700001, 300011, 400001, 500003, 900001};
Arrays.sort(coduri);
System.out.println(Arrays.toString(coduri));
for (int cod : new int[] {400001, 600000}) {
int r = Arrays.binarySearch(coduri, cod);
if (r >= 0) {
System.out.println(cod + " găsit la poziția " + r);
} else {
System.out.println(cod + " lipsește; s-ar insera la poziția " + (-r - 1));
}
}
}
}
Rezultat
[300011, 400001, 500003, 700001, 900001]
400001 găsit la poziția 1
600000 lipsește; s-ar insera la poziția 3
Exemplul 2: Pe un array nesortat, rezultatul e greșit
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] nesortat = {50, 10, 40, 20, 30};
System.out.println("Caut 10 în nesortat: " + Arrays.binarySearch(nesortat, 10));
Arrays.sort(nesortat);
System.out.println("Caut 10 după sortare: " + Arrays.binarySearch(nesortat, 10));
}
}
Rezultat
Caut 10 în nesortat: -1
Caut 10 după sortare: 0
Greșeli frecvente
- Cauți într-un array nesortat. Poți primi „negăsit” pentru o valoare care există.
- Verifici
r == -1pentru „negăsit”. Orice valoare negativă înseamnă negăsit.
Comenzi înrudite
Collections.binarySearch: Caută rapid o valoare într-o listă sortată, prin înjumătățiri. Returnează poziția sau un număr negativ care arată unde ar trebui inserată.Arrays.sort: Sortează pe loc un array: crescător pentru numere și texte sau după un Comparator pentru array-uri de obiecte.TreeSet.ceiling: ceiling(x) găsește cel mai mic element mai mare sau egal cu x; floor(x) cel mai mare element mai mic sau egal cu x.List.indexOf: Returnează poziția primei (indexOf) sau ultimei (lastIndexOf) apariții a unei valori, ori -1 dacă lipsește.