Guava Заказ поваренной книги

Guava Заказ поваренной книги

1. Вступление

Эта поваренная книга иллюстрируетhow to use the Guava style Ordering and Comparators. Это продолжение поваренной книги и примера формата фокуса, которые я начал вthe previous post about Guava collections.

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

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

сначала нули

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

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

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

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

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

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

связывание 2 порядков

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

отменить порядок

List 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 {
    @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 = new OrderingByLenght();
Collections.sort(toSort, byLength);

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

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

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

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

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

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

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

вторичный заказ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

заказ через посредническую функцию

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

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


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

3. Еще кулинарные книги гуавы

Guava - обширная и фантастически полезная библиотека - вот еще несколько API, покрытых в виде кулинарной книги:

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

4. Заключение

Этот экспериментальный формат - поваренная книга - имеет четкую направленность - простоту и скорость, поэтому в большинстве рецептов естьno additional explanation other than the code example itself.

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

Реализация всех этих примеров и фрагментов кодаcan be found over on GitHub - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.