• 枚举


      学了一段时间Java,总结一下到目前为止学到的枚举用法:

    1)可以定义在包中、类中,但不能定义在方法中
    2)枚举类型不能被继承
    3)枚举类型默认继承java.lang.Enum
    4)枚举类型的每个取值都是自己的一个实例对象
    5)枚举类型可以有属性、方法、构造器
    6)枚举类型可以实现接口
    7)枚举类型有静态方法values()获取所有取值

    package com.wsy.enumtest;
    //enum在switch中的应用
    //JDK1.5及之后的switch语句可以支持enum类型,使用枚举,能让我们的代码可读性更强。
    enum Signal {
        GREEN, YELLOW, RED
    }
    
    public class TrafficLight {
        Signal color = Signal.GREEN;
    
        public void change() {
            switch (color) {
            case RED:
                color = Signal.GREEN;
                System.out.println(color);
                break;
            case YELLOW:
                color = Signal.RED;
                System.out.println(color);
                break;
            case GREEN:
                color = Signal.YELLOW;
                System.out.println(color);
                break;
            }
        }
        
        public static void main(String[] args) {
            TrafficLight trafficLight = new TrafficLight();
            trafficLight.change();
        }
    }
    package com.wsy.enumtest;
    //enum实现接口
    //所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。但可以实现接口。
    //在JDK1.5 之前,我们定义常量都是: public static final…… .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
    //例如:enum Color { RED, GREEN, BLANK, YELLOW }
    interface Behaviour {
        void print();
    
        String getInfo();
    }
    
    public enum Color implements Behaviour {
        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
        // 成员变量
        private String name;
        private int index;
    
        // 构造方法
        private Color(String name, int index) {
            this.name = name;
            this.index = index;
        }
    
        // 接口方法
        @Override
        public String getInfo() {
            return this.name;
        }
    
        // 接口方法
        @Override
        public void print() {
            System.out.println(this.index + ":" + this.name);
        }
    
        // 覆盖方法
        @Override
        public String toString() {
            return this.index + "_" + this.name;
        }
    
        public static void main(String[] args) {
            RED.print();
            System.out.println(RED.getInfo());
            System.out.println(RED);
        }
    }

      以下是用枚举做的随机发牌的一个小程序(因为牌的花色固定,大小固定,适合用枚举, 注:没有大小王):

    package com.wsy.enumtest;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Card {
        public enum Rank{
            DEUCE,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING,ACE
        }
        public enum Suit{
            CLUBS,DIAMONDS,HEARTS,SPADES
        }
        
        private final Rank rank;
        private final Suit suit;
        private Card(Rank rank , Suit suit) {
            this.rank = rank;
            this.suit = suit;
        }
        
        public Rank rank() {
            return rank;
        }
        
        public Suit suit() {
            return suit;
        }
        
        public String toString() {
            return rank + "of" + suit;
        }
        
        private static final List<Card> protoDeck = new ArrayList<Card>();
        
        static {
            for(Suit suit : Suit.values()) {
                for(Rank rank : Rank.values()) {
                    protoDeck.add((new Card(rank , suit)));
                    }
                }
        }
        
        public static ArrayList<Card> newDeck() {
            return new ArrayList<Card>(protoDeck);
        }
    }
    
    
    package com.wsy.enumtest;
    
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    public class Deal {
        public static void main(String[] args) {
            if(args.length != 2) {
                System.out.println("Usage:java" + Deal.class.getName() + "numHands cardPerHand");
                System.exit(1);
            }
            
            int numHands = Integer.parseInt(args[0]);
            int cardsPerHand = Integer.parseInt(args[1]);
            List<Card> deck = Card.newDeck();
            Collections.shuffle(deck);
            for(int i = 0; i < numHands; i++) {
                System.out.println(deal(deck , cardsPerHand));
            }
        }
        public static ArrayList<Card> deal(List<Card> deck , int n){
            int deckSize = deck.size();
            List<Card> handView = deck.subList(deckSize-n , deckSize);
            ArrayList<Card> hand = new ArrayList<Card> (handView);
            handView.clear();
            return hand;
        }
    }

     EnumSet集合辅助使用enum类型:allOf()/range()/of()...

    public enum Grade {
        A , B , C , D
    }
    
    import java.util.EnumSet;
    
    public class EnumSetTest {
        public static void outEnumSet(EnumSet es) {
            for (Object o : es) {
                System.out.println(o);
            }
        }
    
        public static void main(String[] args) {
            //打印枚举中所有取值
            EnumSet es = EnumSet.allOf(Grade.class);
            outEnumSet(es);
            System.out.println("************");
            //打印枚举中的A到C
            es = EnumSet.range(Grade.A, Grade.C);
            outEnumSet(es);
            System.out.println("************");
            //打印枚举中的B和D
            es = EnumSet.of(Grade.B,Grade.D);
            outEnumSet(es);
            System.out.println("************");
            //输出枚举中的所有取值
            Grade[] grades = Grade.values();
            for(Object o : grades){
                System.out.println(o);
            }
        }
    }
    
    结果:
    A
    B
    C
    D
    ************
    A
    B
    C
    ************
    B
    D
    ************
    A
    B
    C
    D

    EnumMap集合辅助使用enum类型:

    public enum Grade {
        A , B , C , D
    }
    
    import java.util.EnumMap;
    import java.util.Map;
    
    public class EnumMapTest {
        public static void main(String[] args) {
            EnumMap<Grade, String> em = new EnumMap<Grade, String>(Grade.class);
            em.put(Grade.A, "Excellent");
            em.put(Grade.B, "Good");
            em.put(Grade.C, "Passed");
            em.put(Grade.D, "Fail");
    
            for (Object o : em.entrySet()) {
                Map.Entry entry = (Map.Entry) o;
                Object key = entry.getKey();
                Object value = entry.getValue();
                System.out.println(key + ":" + value);
            }
        }
    }
    
    结果:
    A:Excellent
    B:Good
    C:Passed
    D:Fail
  • 相关阅读:
    Codeforces 841 D
    Codeforces 838 B
    Codeforces 833 C
    Codeforces 101572 D
    Codeforces 101173 C
    Codeforces 444 C
    POJ 3076 Sudoku
    Codeforces 1025 D
    算法笔记--基环树
    Codeforces 1016 E
  • 原文地址:https://www.cnblogs.com/wsyblog/p/7466251.html
Copyright © 2020-2023  润新知