package poker.hand; import static poker.hand.Comparables.compareLists; import java.util.Arrays; import java.util.Collections; import java.util.List; import com.google.common.collect.Lists; public class Hand implements Comparable<Hand> { private final List<Card> cards; public static Hand hand(Card... cards) { return new Hand(cards); } public Hand(Card[] cards) { final List<Card> list = Arrays.asList(cards); Collections.sort(list); Collections.reverse(list); this.cards = list; } @Override public int compareTo(Hand right) { int result = checkTriples(right); if (result != 0) { return result; } result = checkPairs(right); if (result != 0) { return result; } return compareLists(cards, right.cards); } private int checkPairs(Hand right) { final List<Integer> rightPair = right.pairs(); final List<Integer> leftPair = pairs(); return compareLists(leftPair, rightPair); } private int checkTriples(Hand right) { final List<Integer> rightTriples = right.triples(); final List<Integer> leftTriples = triples(); return compareLists(leftTriples, rightTriples); } private List<Integer> triples() { List<Integer> triples = Lists.newArrayList(); for (int i = 2; i < cards.size(); i++) { if (cards.get(i - 2).compareTo(cards.get(i - 1)) == 0 && cards.get(i - 1).compareTo(cards.get(i)) == 0) { triples.add(cards.get(i).rank()); } } return triples; } private List<Integer> pairs() { List<Integer> pairs = Lists.newArrayList(); for (int i = 1; i < cards.size(); i++) { if (cards.get(i - 1).compareTo(cards.get(i)) == 0) { pairs.add(cards.get(i).rank()); } } return pairs; } }