Arrays.binarySearch în Java

Caută rapid o valoare într-un array sortat. Returnează poziția sau un număr negativ care arată unde ar trebui inserată.

Sintaxă
static int binarySearch(int[] a, int key)                 // și pentru celelalte tipuri
static int binarySearch(int[] a, int from, int to, int key)
static <T> int binarySearch(T[] a, T key, Comparator<? super T> c)

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 == -1 pentru „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.