集册 Java实例教程 为接口添加默认方法

为接口添加默认方法

欢马劈雪     最近更新时间:2020-01-02 10:19:05

715
为接口添加默认方法

import java.util.*;

import java.util.stream.*;/**来自 时代Java公众号 - nowjava.com**/

import java.lang.*;

import java.util.function.*;


 interface SortFunction extends Function<Comparator<Card>, Deck> {

    public Deck apply(Comparator<Card> cardComparator);

}


class SortByRankThenSuit implements Comparator<Card> {

    public int compare(Card firstCard, Card secondCard) {

        int compVal = firstCard.getRank().value()

                - secondCard.getRank().value();

        if (compVal != 0)

            return compVal;/*来 自 时 代      J a v a   公   众 号 - nowjava.com*/

        else

            return firstCard.getSuit().value()

                    - secondCard.getSuit().value();

    }

}

 interface Deck {


    List<Card> getCards();


    Deck deckFactory();


    int size();


    void addCard(Card card);


    void addCards(List<Card> cards);


    void addDeck(Deck deck);


    void shuffle();


    void sort();


    void sort(Comparator<Card> c);


    String deckToString();


    Map<Integer, Deck> deal(int players, int numberOfCards)

            throws IllegalArgumentException;


}

interface Card extends Comparable<Card> {


    public enum Suit {

        DIAMONDS(1, "Diamonds"), CLUBS(2, "Clubs"), HEARTS(3, "Hearts"), SPADES(

                4, "Spades");


        private final int value;

        private final String text;


        Suit(int value, String text) {

            this.value = value;

            this.text = text;

        }


        public int value() {

            return value;

        }


        public String text() {

            return text;

        }

    }


    public enum Rank {

        DEUCE(2, "Two"), THREE(3, "Three"), FOUR(4, "Four"), FIVE(5, "Five"), SIX(

                6, "Six"), SEVEN(7, "Seven"), EIGHT(8, "Eight"), NINE(9,

                "Nine"), TEN(10, "Ten"), JACK(11, "Jack"), QUEEN(12,

                "Queen"), KING(13, "King"), ACE(14, "Ace");

        private final int value;

        private final String text;


        Rank(int value, String text) {

            this.value = value;

            this.text = text;

        }


        public int value() {

            return value;

        }


        public String text() {

            return text;

        }

    }


    public Card.Suit getSuit();


    public Card.Rank getRank();

}

 class PlayingCard implements Card {


    private Card.Rank rank;

    private Card.Suit suit;


    public PlayingCard(Card.Rank rank, Card.Suit suit) {

        this.rank = rank;

        this.suit = suit;

    }


    public Card.Suit getSuit() {

        return suit;

    }


    public Card.Rank getRank() {

        return rank;

    }


    public boolean equals(Object obj) {

        if (obj instanceof Card) {

            if (((Card) obj).getRank() == this.rank

                    && ((Card) obj).getSuit() == this.suit) {

                return true;

            } else {

                return false;

            }

        } else {

            return false;

        }

    }


    public int hashCode() {

        return ((suit.value() - 1) * 13) + rank.value();

    }


    public int compareTo(Card o) {

        return this.hashCode() - o.hashCode();

    }


    public String toString() {

        return this.rank.text() + " of " + this.suit.text();

    }


    public static void main(String... args) {

        new PlayingCard(Rank.ACE, Suit.DIAMONDS);

        new PlayingCard(Rank.KING, Suit.SPADES);

    }

}


 class StandardDeck implements Deck {


    private List<Card> entireDeck;


    public StandardDeck(List<Card> existingList) {

        this.entireDeck = existingList;

    }


    public StandardDeck() {

        this.entireDeck = new ArrayList<>();

        for (Card.Suit s : Card.Suit.values()) {

            for (Card.Rank r : Card.Rank.values()) {

                this.entireDeck.add(new PlayingCard(r, s));

            }

        }

    }


    public Deck deckFactory() {

        return new StandardDeck(new ArrayList<Card>());

    }


    public int size() {

        return entireDeck.size();

    }


    public List<Card> getCards() {

        return entireDeck;

    }


    public void addCard(Card card) {

        entireDeck.add(card);

    }


    public void addCards(List<Card> cards) {

        entireDeck.addAll(cards);

    }


    public void addDeck(Deck deck) {

        List<Card> listToAdd = deck.getCards();

        entireDeck.addAll(listToAdd);

    }


    public void sort() {

        Collections.sort(entireDeck);

    }


    public void sort(Comparator<Card> c) {

        Collections.sort(entireDeck, c);

    }


    public void shuffle() {

        Collections.shuffle(entireDeck);

    }


    public Map<Integer, Deck> deal(int players, int numberOfCards)

    throws IllegalArgumentException

{

    int cardsDealt = players * numberOfCards;

    int sizeOfDeck = entireDeck.size();

    if (cardsDealt > sizeOfDeck) {

        throw new IllegalArgumentException(

            "Number of players (" + players +

            ") times number of cards to be dealt (" + numberOfCards +

            ") is greater than the number of cards in the deck (" +

            sizeOfDeck + ").");

    }

        

    Map<Integer, List<Card>> dealtDeck = entireDeck

       .stream()

       .collect(

           Collectors.groupingBy(

               card -> {

                   int cardIndex = entireDeck.indexOf(card);

                   if (cardIndex >= cardsDealt) return (players + 1);

                   else return (cardIndex % players) + 1;

               }));

        

    // Convert Map<Integer, List<Card>> to Map<Integer, Deck>

    Map<Integer, Deck> mapToReturn = new HashMap<>();

           

    for (int i = 1; i <= (players + 1); i++) {

        Deck currentDeck = deckFactory();

        currentDeck.addCards(dealtDeck.get(i));

        mapToReturn.put(i, currentDeck);

    }

    return mapToReturn;

}


    public String deckToString() {

    return this.entireDeck

        .stream()

        .map(Card::toString)

        .collect(Collectors.joining("\n"));

}


    public static void main(String... args) {

    StandardDeck myDeck = new StandardDeck();

    System.out.println("Creating deck:");

    myDeck.sort();

    System.out.println("Sorted deck");

    System.out.println(myDeck.deckToString());

    myDeck.shuffle();

    myDeck.sort(new SortByRankThenSuit());

    System.out.println("Sorted by rank, then by suit");

    System.out.println(myDeck.deckToString());        

    myDeck.shuffle();

    myDeck.sort(

        Comparator.comparing(Card::getRank)

            .thenComparing(Comparator.comparing(Card::getSuit)));

    System.out.println("Sorted by rank, then by suit " +

        
展开阅读全文