Guava Kookboek bestellen

1. Inleiding

Dit kookboek illustreert hoe de Guava-stijl Ordering en Comparators te gebruiken. Het zet het kookboek- en voorbeeldfocusformaat voort dat ik begon in het vorige bericht over Guava-collecties.

2. Het kookboek

omgaan met null-waarden in een collectie

nulls eerst

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

nulls laatste

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

natuurlijke ordening

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

2 bestellingen koppelen

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

een volgorde omkeren

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

aangepaste volgorde - Strings op lengte

private class OrderingByLenght breidt Ordering uit {@Override public int Compare (String s1, String s2) {return Ints.compare (s1.length (), s2.length ()); }} List toSort = Arrays.asList ("zz", "aa", "b", "ccc"); Ordering byLength = nieuwe OrderingByLenght (); Collections.sort (toSort, byLength); Bestellen verwachtOrder = Ordering.explicit (Lists.newArrayList ("b", "zz", "aa", "ccc")); assertTrue (verwachteOrder.isOrdered (toSort))

controle expliciete bestelling

List toSort = Arrays.asList ("zz", "aa", "b", "ccc"); Ordering byLength = nieuwe OrderingByLenght (); Collections.sort (toSort, byLength); Bestellen verwachtOrder = Ordering.explicit (Lists.newArrayList ("b", "zz", "aa", "ccc")); assertTrue (verwachteOrder.isOrdered (toSort));

het controleren van de volgorde van de string

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

secundaire ordening

List toSort = Arrays.asList ("zz", "aa", "b", "ccc"); Ordering byLength = nieuwe OrderingByLenght (); Collections.sort (toSort, byLength.compound (Ordering.natural ())); Bestellen verwachtOrder = Ordering.explicit (Lists.newArrayList ("b", "aa", "zz", "ccc")); assertTrue (verwachteOrder.isOrdered (toSort));

complex voorbeeld van bestelling op maat - met ketting

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

sorteren met toString vertegenwoordiging

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

sorteer, dan vind (binair zoeken)

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

vind min / max zonder te hoeven sorteren (sneller)

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

het creëren van een gesorteerde kopie van de lijst vanuit een bestelling

List toSort = Arrays.asList ("aa", "b", "ccc"); Lijst gesorteerdCopy = nieuwe OrderingByLenght (). GesorteerdCopy (toSort); Bestellen verwachtOrder = Ordering.explicit (Lists.newArrayList ("b", "aa", "ccc")); assertFalse (verwachteOrder.isOrdered (toSort)); assertTrue (verwachteOrder.isOrdered (gesorteerde kopie));

het maken van een gesorteerde gedeeltelijke kopie - de minste elementen

List toSort = Arrays.asList (2, 1, 11, 100, 8, 14); List leastOf = Ordering.natural (). LeastOf (toSort, 3); Lijst verwacht = Lists.newArrayList (1, 2, 8); assertThat (verwacht, gelijk aan (minste));

bestellen via tussenpersoon Functie

List toSort = Arrays.asList (2, 1, 11, 100, 8, 14); Bestellen bestellen = Ordering.natural (). OnResultOf (Functions.toStringFunction ()); Lijst gesorteerdCopy = order.sortedCopy (toSort); Lijst verwacht = Lists.newArrayList (1, 100, 11, 14, 2, 8); assertThat (verwacht, gelijk aan (gesorteerdCopy));

Opmerking: de sorteerlogica zal eerst de getallen door de functie leiden - ze transformeren in strings - en vervolgens sorteren met natuurlijke volgorde op de strings

3. Meer Guava-kookboeken

Guava is een uitgebreide en fantastisch nuttige bibliotheek - hier zijn nog een paar API's die in kookboekvorm worden behandeld:

  • Guava Functioneel kookboek

  • Guava Collections kookboek

Genieten.

4. Conclusie

Dit experimentele formaat - het kookboek - heeft een duidelijke focus - eenvoud en snelheid, net als de meeste recepten geen aanvullende uitleg anders dan het codevoorbeeld zelf.

En zoals ik al eerder zei - dit als een levend document - nieuwe voorbeelden en use cases zijn welkom in de comments, en ik zal mijn eigen voorbeelden blijven toevoegen als ik ze tegenkom.

De implementatie van al deze voorbeelden en codefragmenten is te vinden op GitHub - dit is een op Maven gebaseerd project, dus het zou gemakkelijk moeten kunnen worden geïmporteerd en uitgevoerd zoals het is.