Перейти к основному содержимому

Поваренная книга заказа гуавы

· 3 мин. чтения

1. Введение

Эта кулинарная книга иллюстрирует , как использовать упорядочивание и сравнение в стиле гуавы . Это продолжение поваренной книги и примера формата фокуса, которые я начал в предыдущем посте о коллекциях гуавы .

2. Поваренная книга

работа с нулями в коллекции

нули сначала

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

нули последние

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

естественный порядок

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

assertTrue(Ordering.natural().isOrdered(toSort));

объединение 2 заказов

List<Integer> toSort = Arrays.asList(3, 5, 4, 1, 2);
Collections.sort(toSort, Ordering.natural().reverse());

отменить заказ

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

пользовательский порядок — строки по длине

private class OrderingByLenght extends Ordering<String> {
@Override
public int compare(String s1, String s2) {
return Ints.compare(s1.length(), s2.length());
}
}
List<String> toSort = Arrays.asList("zz", "aa", "b", "ccc");
Ordering<String> byLength = new OrderingByLenght();
Collections.sort(toSort, byLength);

Ordering<String> expectedOrder = Ordering.explicit(Lists.newArrayList("b", "zz", "aa", "ccc"));
assertTrue(expectedOrder.isOrdered(toSort))

проверка явного порядка

List<String> toSort = Arrays.asList("zz", "aa", "b", "ccc");
Ordering<String> byLength = new OrderingByLenght();
Collections.sort(toSort, byLength);

Ordering<String> expectedOrder = Ordering.explicit(Lists.newArrayList("b", "zz", "aa", "ccc"));
assertTrue(expectedOrder.isOrdered(toSort));

проверка порядка строк

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

assertFalse(Ordering.natural().isStrictlyOrdered(toSort));

вторичный порядок

List<String> toSort = Arrays.asList("zz", "aa", "b", "ccc");
Ordering<String> byLength = new OrderingByLenght();
Collections.sort(toSort, byLength.compound(Ordering.natural()));

Ordering<String> expectedOrder = Ordering.explicit(Lists.newArrayList("b", "aa", "zz", "ccc"));
assertTrue(expectedOrder.isOrdered(toSort));

**пример сложного индивидуального заказа – с цепочкой

**

List<String> toSort = Arrays.asList("zz", "aa", null, "b", "ccc");
Collections.sort(toSort,
new OrderingByLenght().reverse().compound(Ordering.natural()).nullsLast());
System.out.println(toSort);

сортировать с использованием представления toString

List<Integer> toSort = Arrays.asList(1, 2, 11);
Collections.sort(toSort, Ordering.usingToString());

Ordering<Integer> expectedOrder = Ordering.explicit(Lists.newArrayList(1, 11, 2));
assertTrue(expectedOrder.isOrdered(toSort));

сортировать, а затем найти (бинарный поиск)

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

найти мин/макс без сортировки (быстрее)

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

создание отсортированной копии списка из заказа

List<String> toSort = Arrays.asList("aa", "b", "ccc");
List<String> sortedCopy = new OrderingByLenght().sortedCopy(toSort);

Ordering<String> expectedOrder = Ordering.explicit(Lists.newArrayList("b", "aa", "ccc"));
assertFalse(expectedOrder.isOrdered(toSort));
assertTrue(expectedOrder.isOrdered(sortedCopy));

создание отсортированной частичной копии — наименьшее количество элементов

List<Integer> toSort = Arrays.asList(2, 1, 11, 100, 8, 14);
List<Integer> leastOf = Ordering.natural().leastOf(toSort, 3);
List<Integer> expected = Lists.newArrayList(1, 2, 8);
assertThat(expected, equalTo(leastOf));

заказ через посредника Функция

List<Integer> toSort = Arrays.asList(2, 1, 11, 100, 8, 14);
Ordering<Object> ordering = Ordering.natural().onResultOf(Functions.toStringFunction());
List<Integer> sortedCopy = ordering.sortedCopy(toSort);

List<Integer> expected = Lists.newArrayList(1, 100, 11, 14, 2, 8);
assertThat(expected, equalTo(sortedCopy));

примечание : логика сортировки сначала прогоняет числа через функцию, преобразуя их в строки, а затем сортирует строки в естественном порядке.

3. Больше поваренных книг по гуаве

Guava — это всеобъемлющая и фантастически полезная библиотека — вот еще несколько API, представленных в форме поваренной книги:

Функциональная поваренная книга гуавы

Поваренная книга коллекций гуавы

Наслаждаться.

4. Вывод

Этот экспериментальный формат — поваренная книга — имеет четкую направленность — простоту и скорость, поэтому у большинства рецептов нет дополнительных объяснений, кроме самого примера кода .

И, как я упоминал ранее — это как живой документ — в комментариях приветствуются новые примеры и варианты использования, и я буду продолжать добавлять свои собственные по мере того, как сталкиваюсь с ними.

Реализацию всех этих примеров и фрагментов кода можно найти на GitHub — это проект на основе Maven, поэтому его легко импортировать и запускать как есть.