Guava bestilling av kokebok

1. Introduksjon

Denne kokeboken illustrerer hvordan du bruker Guava-stil Bestilling og komparatorer. Det fortsetter kokeboken og eksempelfokusformatet som jeg startet i forrige innlegg om Guava-samlinger.

2. Kokeboken

håndtere null i en samling

null først

List toSort = Arrays.asList (3, 5, 4, null, 1, 2); Collections.sort (toSort, Ordering.natural (). NullsFirst ()); assertThat (toSort.get (0), nullValue ());

null sist

List toSort = Arrays.asList (3, 5, 4, null, 1, 2); Collections.sort (toSort, Ordering.natural (). NullsLast ()); assertThat (toSort.get (toSort.size () - 1), nullValue ());

naturlig bestilling

List toSort = Arrays.asList (3, 5, 4, 1, 2); Collections.sort (toSort, Ordering.natural ()); assertTrue (Ordering.natural (). er bestilt (tilSort));

kjetting 2 bestillinger

List toSort = Arrays.asList (3, 5, 4, 1, 2); Collections.sort (toSort, Ordering.natural (). Reverse ());

reversere en bestilling

List toSort = Arrays.asList (3, 5, 4, null, 1, 2); Collections.sort (toSort, Ordering.natural (). NullsLast (). Reverse ()); assertThat (toSort.get (0), nullValue ());

tilpasset rekkefølge - Strenger etter lengde

privat klasse OrderingByLenght utvider bestilling {@Override public int compare (String s1, String s2) {return Ints.compare (s1.length (), s2.length ()); }} List toSort = Arrays.asList ("zz", "aa", "b", "ccc"); Bestilling etter lengde = ny OrderingByLenght (); Collections.sort (toSort, byLength); Bestilling av forventet bestilling = Ordering.explicit (Lists.newArrayList ("b", "zz", "aa", "ccc")); assertTrue (expectOrder.isOrdered (toSort))

sjekke eksplisitt rekkefølge

List toSort = Arrays.asList ("zz", "aa", "b", "ccc"); Bestilling etter lengde = ny OrderingByLenght (); Collections.sort (toSort, byLength); Bestilling av forventet bestilling = Ordering.explicit (Lists.newArrayList ("b", "zz", "aa", "ccc")); assertTrue (expectOrder.isOrdered (toSort));

sjekke strengbestilling

List toSort = Arrays.asList (3, 5, 4, 2, 1, 2); Collections.sort (toSort, Ordering.natural ()); assertFalse (Ordering.natural (). isStrictlyOrdered (toSort));

sekundærbestilling

List toSort = Arrays.asList ("zz", "aa", "b", "ccc"); Bestilling etter lengde = ny OrderingByLenght (); Collections.sort (toSort, byLength.compound (Ordering.natural ())); Bestilling forventetOrder = Ordering.explicit (Lists.newArrayList ("b", "aa", "zz", "ccc")); assertTrue (expectOrder.isOrdered (toSort));

komplekst spesialbestillingseksempel - med kjetting

List toSort = Arrays.asList ("zz", "aa", null, "b", "ccc"); Collections.sort (toSort, new OrderingByLenght (). Reverse (). Compound (Ordering.natural ()). NullsLast ()); System.out.println (toSort);

sorter ved hjelp av toString representasjon

List toSort = Arrays.asList (1, 2, 11); Collections.sort (toSort, Ordering.usingToString ()); Bestilling expectOrder = Ordering.explicit (Lists.newArrayList (1, 11, 2)); assertTrue (expectOrder.isOrdered (toSort));

sorter, finn deretter (binært søk)

List toSort = Arrays.asList (1, 2, 11); Collections.sort (toSort, Ordering.usingToString ()); int funnet = Ordering.usingToString (). binarySearch (toSort, 2); System.out.println (funnet);

finn min / maks uten å måtte sortere (raskere)

List toSort = Arrays.asList (2, 1, 11, 100, 8, 14); int funnet = Ordering.usingToString (). min (toSort); assertThat (funnet, equalTo (1));

lage en sortert kopi av listen fra en bestilling

List toSort = Arrays.asList ("aa", "b", "ccc"); Liste sortedCopy = ny OrderingByLenght (). SortedCopy (toSort); Bestilling av forventet bestilling = Ordering.explicit (Lists.newArrayList ("b", "aa", "ccc")); assertFalse (expectOrder.isOrdered (toSort)); assertTrue (expectOrder.isOrdered (sortedCopy));

lage en sortert delkopi - de færreste elementene

List toSort = Arrays.asList (2, 1, 11, 100, 8, 14); List leastOf = Ordering.natural (). MinsteOf (toSort, 3); Liste forventet = Lists.newArrayList (1, 2, 8); assertThat (forventet, equalTo (minste av));

bestilling via mellomledd Funksjon

List toSort = Arrays.asList (2, 1, 11, 100, 8, 14); Ordering ordering = Ordering.natural (). OnResultOf (Functions.toStringFunction ()); List sortedCopy = ordering.sortedCopy (toSort); Liste forventet = Lists.newArrayList (1, 100, 11, 14, 2, 8); assertThat (forventet, equalTo (sortedCopy));

Merk: sorteringslogikken vil først kjøre tallene gjennom funksjonen - transformere dem til strenger - deretter sortere med naturlig rekkefølge på strengene

3. Flere Guava kokebøker

Guava er et omfattende og fantastisk nyttig bibliotek - her er noen flere API-er dekket i kokebokform:

  • Guava funksjonell kokebok

  • Guava Collections Cookbook

Nyt.

4. Konklusjon

Dette eksperimentelle formatet - kokeboken - har et tydelig fokus - enkelhet og hastighet, slik de fleste oppskrifter har ingen ytterligere forklaring enn selve kodeeksemplet.

Og som jeg nevnte før - dette som et levende dokument - nye eksempler og brukssaker er velkomne i kommentarene, og jeg vil fortsette å legge til mine egne når jeg støter på dem.

Implementeringen av alle disse eksemplene og kodebiter kan du finne på GitHub - dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.