Архив метки: java

Java List split

Долго валялось в закладках на SO — и пригодилось, наконец. Обычно — или уже была «в коробке» Guava с Lists.partition(), или — Apache Commons и его ListUtils.partition().

Деление на подмножества (каплю доработано относительно исходника на SO):

// https://stackoverflow.com/a/30072617
public static <T> Stream<List<T>> listPartition(@NotNull List<T> source, @Positive int length) {
    requireNonNull(source, "Source list must not be null");
    if (length <= 0) {
        throw new IllegalArgumentException("Partitions length must be greater than zero");
    }
    int size = source.size();
    if (size == 0) {
        return Stream.empty();
    }
    if (size <= length) {
        return Stream.of(source);
    }
    int fullChunks = (size - 1) / length;
    return IntStream.range(0, fullChunks + 1)
        .mapToObj(n -> source.subList(n * length, n == fullChunks ? size : (n + 1) * length));
}
Читать далее Java List split

Spring: TLS/SSL подключение к RabbitMQ

Возникла потребность подключаться из Java приложения к брокеру RabbitMQ с использованием защищенного соединения. Приложение на Spring Boot, живёт в контейнере Docker и должно слушать два узла Rabbit параллельно.

  • На входе: сертификат клиентского узла — контейнер client-cert.pfx, корневой сертификат для него root-cert.crt
  • Открытый серверный сертификат шлюза Rabbit: выкачивается автоматически (можно подложить вручную)
  • Используемая версия java поддерживает форматы хранилищ и JKS, и PKCS12
  • Требуется: создать и положить сертификаты в Key Store (сертификаты приложения «клиентские») и Trust Store (доверенные «серверные» сертификаты). В чём разница.
Читать далее Spring: TLS/SSL подключение к RabbitMQ

Перекладываешь жысоны? Пссст, друг, смотри сюда!

Не знаю, как я раньше жил без этих плагинов…

Да нормально жил, но утомлялся точно больше. Не скажу даже вот так сразу, какой из них полезней. Остановлюсь на каждом чуть подробней.

Читать далее Перекладываешь жысоны? Пссст, друг, смотри сюда!

Получение класса «Enum с параметром» по значению параметра

Частенько в коде встречаются перечисления, дополнительно хранящие некие значения (в виде private final поля обычно).

Чтобы в дальнейшем можно было, например, при сериализации в json это значение подставлять автоматом (@JsonValue у Jackson). Тогда возникает обычно и обратная задача — десериализовать (распарсить) значение обратно в Enum (@JsonCreator у Jackson).

Вот мне и надоело копипастить туда-сюда все эти методы (сериализации/десериализации) между классами Enum. Решил сделать один раз утилитный метод и в проекте им пользоваться. Благо, время позволило.

Читать далее Получение класса «Enum с параметром» по значению параметра

HackerRank Bit Manipulation: Counter game

Вторая из ранее сохранённых и ныне обретённых задачек с HackerRank. Как понятно из заголовка — решается через битовые операции.

Хотя — теоретическим можно было бы помучиться с BigInteger и арифметикой… И посмотреть, какое время займёт поиск решения.

import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int t = in.nextInt();
        for (int a0 = 0; a0 < t; a0++) {
            long n = in.nextLong();
            String result = counterGame(n - 1);
            System.out.println(result);
        }
        in.close();
    }

    private static String counterGame(long n) {
        //long mask = 0x8000000000000000L; //2^63 in hex //W
        //eq:
        //long mask = -9223372036854775808L; //2^63 //W
        long mask;
        int step = 0;
        for (int i = 63; i >= 0; i--) {
            mask = 1L << i;
            //compare with 2 power i
            if ((n & mask) != 0) {
                //we max 2^i
                //step++;
                step = step ^ 1;
            }
            n -= mask;
            //mask >>>= 1;
        }

        return ((step & 1) != 0) ? "Louise" : "Richard";
    }

}

Традиционно — решение на Гитхабе.

https://www.hackerrank.com/challenges/counter-game/problem

HackerRank 30 Days of Code: Day 11: 2D Arrays

Не Литкодом единым, как говорится! Нашёл на диске пару задачек с HackerRank — видимо, показались тогда особо любопытными, и были сохранены.

Впрочем, и сейчас они выглядят интересно. Эта, например (первая из них) — перемещение паттерна в виде «песочных часов» по «игровому полю», представленному матрицей, с целью найти такой паттерн, сумма цифр в котором будет максимальной.

Здесь у меня получилось два решения — частное (на Java) и общее (на Perl).

Читать далее HackerRank 30 Days of Code: Day 11: 2D Arrays