lots of exercises in java... from https://github.com/exercism/java

Hand.java 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.LinkedHashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.stream.Collectors;
  11. public class Hand {
  12. private String input;
  13. private int score;
  14. public Hand(String hand) {
  15. this.input = hand;
  16. this.score = scoreHand(parseCards(hand));
  17. }
  18. public int getScore() {
  19. return score;
  20. }
  21. public String getInput() {
  22. return input;
  23. }
  24. private List<Card> parseCards(String hand) {
  25. ArrayList<Card> parsedCards = new ArrayList<Card>();
  26. String[] parseString = hand.split(" ");
  27. for (int i = 0; i < parseString.length; i++) {
  28. parsedCards.add(new Card(parseString[i]));
  29. }
  30. return parsedCards;
  31. }
  32. private Map<Integer, Integer> getfrequencyMap(List<Card> cards) {
  33. Map<Integer, Integer> frequencyMap = new HashMap<Integer, Integer>();
  34. for (Card c : cards) {
  35. if (frequencyMap.containsKey(c.getRank())) {
  36. frequencyMap.put(c.getRank(), frequencyMap.get(c.getRank()) + 1);
  37. } else {
  38. frequencyMap.put(c.getRank(), 1);
  39. }
  40. }
  41. return frequencyMap;
  42. }
  43. private int scoreHand(List<Card> cards) {
  44. List<Card> cardsByRank = cards.stream().sorted(Comparator.comparing(Card::getRank)).unordered()
  45. .collect(Collectors.toList());
  46. Map<Integer, Integer> frequencyMap = getfrequencyMap(cards);
  47. List<Integer> ranks = frequencyMap.entrySet().stream().map(x -> x.getKey()).sorted(Comparator.reverseOrder())
  48. .collect(Collectors.toList());
  49. frequencyMap = frequencyMap.entrySet().stream().sorted(Map.Entry.comparingByValue(Collections.reverseOrder()))
  50. .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
  51. List<Integer> rankCounts = frequencyMap.entrySet().stream().map(x -> x.getValue()).collect(Collectors.toList());
  52. List<Integer> suits = cards.stream().map(s -> s.getSuit()).collect(Collectors.toList());
  53. return calculatedScore(frequencyMap, cardsByRank, ranks, rankCounts, suits);
  54. }
  55. private int calculatedScore(Map<Integer, Integer> frequencyMap, List<Card> cardsByRank, List<Integer> ranks,
  56. List<Integer> rankCounts, List<Integer> suits) {
  57. if (ranks.equals(Arrays.asList(14, 5, 4, 3, 2))) {
  58. ranks = Arrays.asList(5, 4, 3, 2, 1);
  59. }
  60. boolean flush = suits.stream().distinct().count() == 1;
  61. boolean straight = ranks.stream().distinct().count() == 5 && ranks.get(0) - ranks.get(4) == 4;
  62. Iterator<Integer> iteratorOverFrequencies = frequencyMap.keySet().iterator();
  63. int highestFrequency = iteratorOverFrequencies.next();
  64. if (straight && flush) {
  65. return 800 + highestFrequency;
  66. }
  67. if (rankCounts.equals(Arrays.asList(4, 1))) {
  68. return 700 + cardsByRank.get(0).getRank();
  69. }
  70. if (rankCounts.equals(Arrays.asList(3, 2))) {
  71. return 600 + cardsByRank.get(0).getRank();
  72. }
  73. if (flush) {
  74. return 500 + highestFrequency;
  75. }
  76. if (straight) {
  77. return 400 + highestFrequency;
  78. }
  79. if (rankCounts.equals(Arrays.asList(3, 1, 1))) {
  80. return 300 + cardsByRank.get(0).getRank();
  81. }
  82. if (rankCounts.equals(Arrays.asList(2, 2, 1))) {
  83. return 200 + Math.max(highestFrequency, iteratorOverFrequencies.next());
  84. }
  85. if (rankCounts.equals(Arrays.asList(2, 1, 1, 1))) {
  86. return 100 + highestFrequency;
  87. }
  88. Collections.sort(ranks, (a, b) -> b.compareTo(a));
  89. Collections.reverse(ranks);
  90. return ranks.get(0);
  91. }
  92. }