Как найти возможные пары комбинаций и совпадения с разными парами из заданного списка игроков с помощью API Java Stream - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь создать возможную комбинацию пары в указанном списке игроков, а также хочу найти возможное совпадение среди этих разных пар.

  • Создан класс Pojo для пары - споля как Игрок 1 и Игрок 2.
  • Итерированный список с возможной другой парой (например, p1, p2 & p3, p4 & p2, p3 и т. д.)
  • Затем найдите возможные разные пары всовпадение (сколько совпадений возможно).

public class CombinationCreator {

    public static void main(String[] args) {

        List<String> playerList = Arrays.asList("PlayerA","PlayerB","PlayerC","PlayerD","PlayerE","PlayerF");
        List<PlayPair> pairs = new ArrayList<>();

        playerList.forEach(p -> {
            playerList.stream().filter(p2 -> !p.equals(p2)).forEach(p2 -> pairs.add(new PlayPair(p, p2)));
        });

        //Printing all possbile pair ( with duplicate)
        pairs.forEach(c-> System.out.println(c));           
    }
}

Класс пары POJO:

public class PlayPair {

    private String player1;
    private String player2;
    // getters and setters

    @Override
    public String toString() {
        return "PlayPair [player1=" + player1 + ", player2=" + player2 + "]";
    }

    public PlayPair(String player1, String player2) {
        super();
        this.player1 = player1;
        this.player2 = player2;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;

        PlayPair other = (PlayPair) obj;
        if (player1 == null) {
            if (other.player1 != null)
                return false;
        } else if (player2 == null) {
            if (other.player2 != null)
                return false;
        }

        if (!((player1.equals(other.player1) && player2.equals(other.player2))
                || (player1.equals(other.player2) && player2.equals(other.player1))))
            return false;

        return true;
    }
}

Так как я очень новичок в Java Stream API и лямбде, я немного пытаюсь найтисочетание. В классической Java7 код кажется очень неуклюжим, а не эффективным способом. Есть ли самое простое и простое кодирование, способное решить мои проблемы?

1 Ответ

0 голосов
/ 12 октября 2019

Учитывая текущий код, вы можете использовать flatMap при использовании stream из списка игроков, чтобы map их до PlayPair как:

Set<PlayPair> pairs = playerList.stream()
        .flatMap(player1 -> playerList.stream()
                .filter(player2 -> !player1.equals(player2))
                .map(player2 -> new PlayPair(player1, player2)))
        .collect(Collectors.toCollection(LinkedHashSet::new)); // for unique ordered pairs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...