数组实用类Arrays和枚举类型Enum

本文介绍了Java中数组的操作方法及枚举类型的使用技巧。详细解释了如何利用Arrays类进行数组填充、排序、查找等操作,并展示了枚举类型的遍历与在switch语句中的应用。

一、数组使用类Arrays

1.在java.util包中,Arrays提供了一系列静态方法,帮助操作数组。以下是较常用的一些方法。
(1) equals方法,比较两个数组参数是否相同。
(2) fill方法,向数组中填充数据参数。
(3) binarySearch方法,查找数组中元素的值与给定数据相同的元素。
(4) sort方法,将数组按升序排列。
(5) copyOfRange方法,将数组的指定范围复制到一个新数组。
(6) toString方法,返回指定数组内容的字符串表示形式。
    代码示例如下:
/**
* Arrays的一系列静态方法
*/
import java.util.Arrays;
public class ArraysTest2{
    public static void main(String[] args){
        //基本数据类型、字符串
        String[] arr = new String[5];
        Arrays.fill(arr,0,3,"董帅");//s填充范围是0-2,不包含3
        for(String s : arr){
            System.out.println(s + ",");
        }
        System.out.println();
        //引用数据类型
        ArraysTest2[] arr2 = new ArraysTest2[5];
        Arrays.fill(arr2,2,4,new ArraysTest2());//填充范围是2-3,不包含4
        for(ArraysTest2 a : arr2){
            System.out.println(a + ",");
        }

        //查找数组中元素的值与给定数据相同的元素
        int[] arr3 = {2,6,5,63,2550,2346,34122};
        System.out.println(Arrays.binarySearch(arr3,0,3,6) + "\n");//查找范围是0-2,返回的是数组下标
        Arrays.sort(arr3);//将数组升序排序
        System.out.println(Arrays.binarySearch(arr3,0,3,6) + "\n");
        for(int i : arr3){
            System.out.println(i);
        }

        int[] arr4 = {1,4,23,3,54,32,4645};
        int[] arr5 = Arrays.copyOf(arr4,5);//赋值到新数组,范围是0-4
        for(int i : arr5){
            System.out.print(i + ",");
        }
        System.out.println();
        int[] arr6 = Arrays.copyOfRange(arr4,2,5);//赋值到新数组,范围是2-4
        for(int i : arr6){
            System.out.print(i + ",");
        }
        System.out.println();

        System.out.print(Arrays.toString(arr4));//返回数组的字符串表示形式
    }
}

二、枚举类型Enum
枚举类型enum是在JDK5.0加入的类型,类型安全,使枚举数值定义更加紧凑有效。
1.遍历枚举类型

/**
* 枚举类型enum
*/
public class EnumTest{
    public enum StudentGrade{
        A,B,C,D,E,F
    };
    public static void main(String[] args){
        System.out.println("学生平均成绩:" + StudentGrade.A);

        for(StudentGrade sg : StudentGrade.values()){//遍历枚举类型,values()方法返回了一个独立的StudentGrade实例构成的数组
            System.out.println("The Grade is:" + sg);
        }
        StudentGrade s = StudentGrade.valueOf("E");//以字符串的形式返回某一个元素的值。
        System.out.println("your grade is:" + s);
    }
}
2.在switch中使用枚举类型
/**
* 枚举类型enum,在switch语句中使用
*/
public class EnumSwitch{
    public enum Car{A,B,C,D,E,F,G,H};
    public static void main(String[] args){
        Car c = Car.G;
        switch(c){
            case A:
                System.out.println("360");
                break;
            case B:
                System.out.println("小米");
                break;
            case C:
                System.out.println("华为");
                break;
            case D:
                System.out.println("苹果");
                break;
            default:
                System.out.println("HTC");
                break;
        }
    }
}

三、几道练习题
(1)求二重循环所有元素的和

/**
* 求二位数组所有元素的和
*/
public class Task140_3{
    public static void main(String[] args){
        int[][] a = {{11,23,},{234,12,312,53},{423,53,123,65432}};
        int sum = 0;
        for(int i = 0;i <= a.length - 1;i++){
            for(int j = 0;j <= a[i].length - 1;j++){
                sum += a[i][j];
            }
        }
        System.out.println(sum);
    }
}
    (2) 判断一个单词是否在数组里面
/**
*判断一个单词是否在数组里面
*/
import java.util.Scanner;
import java.util.Arrays;
public class Task140_2{
    public static void main(String[] args){
        System.out.print("Please input a word:");
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        String[] str = {"dong","shuai","brilliant","awesome","shackboey","skydosh"};
        int b = Arrays.binarySearch(str,s);
        if(b >= 0){
            System.out.println("Here am I!");
        }else{
            System.out.println("what the hell!");
        }
    }
}
    (3) 随机输出一个字符串
/**
*   随机输出字符串
*/
import java.lang.Math;
public class Task140_4{
    public static void main(String[] args){
        String[] arr = {"dong","shuai","zangyan","mudi","wangchao","jiaru"};
        System.out.println(arr[2]);
        int i = (int)(Math.random() * arr.length);
        System.out.println(arr[i]);
    }
}
    (4)生成100个随机数,放到数组中,然后排序输出
/**
* 生成100个随机数,放在数组中,然后排序输出
*/
import java.util.*;
public class Task140_5{
    public static void main(String[] args){
        int[] arr = new int[100];
        for(int i = 0;i < 100;i++){
            Random rnd = new Random();
            arr[i] = (int)(rnd.nextInt(Integer.MAX_VALUE) + 1);
            System.out.print(arr[i] + ",");
        }
        System.out.println();
        Arrays.sort(arr);
        for(int j = 0;j < 100;j++){
            System.out.print(arr[j] + " ");
        }
    }
}
    (5) 统计字符串中的英文字母、空格、数字和其它字符的个数。
/**
* 统计字符串中各类型字符的个数
*/
import java.util.*;
import java.io.*;
//import java.io.InputStream;
public class Task140_6{
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("please input character string:");
        String s = br.readLine();
        //Task140_6 t = new Task140_6();
        countSum(s);
    }
    public static void countSum(String s){
        int alphabet = 0;
        int blankspace = 0;
        int number = 0;
        int other = 0;
        for(int i = 0;i < s.length();i++){
            char c = s.charAt(i);
            if(c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z') alphabet++;
            else if(c == ' ') blankspace++;
            else if(c >= '0' && c <= '9') number++;
            else other++;
        }
        System.out.println("字母个数为:" + alphabet);
        System.out.println("空格个数为:" + blankspace);
        System.out.println("数字个数为:" + number);
        System.out.println("其他字符个数为:" + other);
    }
}
<think>嗯,用户之前已经问过枚举类的用途,我用了红绿灯衣服尺码的例子做了详细解释。现在用户要求写一个长一点的枚举类应用代码。我需要考虑用户可能的实际需求,他们可能希望看到更复杂的例子,或者在不同场景下的应用。 首先,用户可能对枚举的基础有了了解,现在需要进阶的示例。我应该选一个能展示枚举多种功能的例子,比如状态机、自定义方法、实现接口等。游戏状态管理是个不错的选择,因为它可以涵盖多种状态切换不同行为。 其次,用户可能希望代码结构清晰,注释详细,方便理解。所以示例代码需要分块展示,每部分有说明。同时,结合场景,比如RPG游戏,能增加趣味性,帮助记忆。 还要考虑枚举的高级用法,比如单例模式、策略模式,但之前的回复已经提到过,这次可能需要更复杂的整合。比如在游戏状态中处理不同事件,每个状态有不同的行为,并且可以转换到其他状态。 另外,用户可能希望看到实际应用中的代码结构,比如如何组织枚举类,添加字段方法,使用Stream API处理等。这样能展示枚举的灵活性强大功能。 最后,确保代码正确,没有语法错误,并且符合Java规范。同时,用中文注释,方便用户理解。总结部分要突出枚举的优势,帮助用户记忆应用。</think>好的!我用一个「RPG游戏状态管理」的完整案例,带你体验枚举类的高级玩法。代码包含自定义方法、状态切换、事件处理等实用技巧(约30行核心代码+详细注释): --- ### 场景描述 设计一个RPG游戏的战斗状态系统: - 5种战斗状态:待机、备战、战斗、胜利、逃跑 - 每个状态有不同的行为限制 - 支持状态间的合法转换 - 记录状态持续时间 --- ### 完整代码实现 ```java /** * 战斗状态枚举(演示高级用法) */ public enum BattleState { // 枚举项 + 自定义属性 IDLE("待机", 0) { @Override public boolean canAttack() { return false; } @Override public BattleState handleEvent(GameEvent event) { return switch (event) { case PLAYER_MOVE -> PREPARE; case MONSTER_APPEAR -> PREPARE; default -> this; }; } }, PREPARE("备战", 5) { @Override public boolean canAttack() { return true; } @Override public BattleState handleEvent(GameEvent event) { return switch (event) { case BATTLE_START -> FIGHTING; case PLAYER_FLEE -> FLEE; default -> this; }; } }, FIGHTING("战斗中", Integer.MAX_VALUE) { @Override public boolean canAttack() { return true; } @Override public BattleState handleEvent(GameEvent event) { return switch (event) { case ENEMY_DEFEATED -> VICTORY; case PLAYER_ESCAPE -> FLEE; default -> this; }; } }, VICTORY("胜利", 10), FLEE("逃跑", 3); // 共有属性 private final String chineseName; private final int maxDuration; // 状态最大持续时间(秒) // 抽象方法:是否允许攻击(默认实现) public boolean canAttack() { return false; } // 抽象方法:事件处理(默认返回当前状态) public BattleState handleEvent(GameEvent event) { return this; } // 枚举构造器 BattleState(String chineseName, int maxDuration) { this.chineseName = chineseName; this.maxDuration = maxDuration; } // 实用方法:获取所有可战斗状态 public static List<BattleState> getCombatStates() { return Arrays.stream(values()) .filter(state -> state.canAttack()) .collect(Collectors.toList()); } // Getter public String getChineseName() { return chineseName; } public int getMaxDuration() { return maxDuration; } } /** * 游戏事件枚举(演示组合使用) */ enum GameEvent { PLAYER_MOVE, MONSTER_APPEAR, BATTLE_START, ENEMY_DEFEATED, PLAYER_ESCAPE, PLAYER_FLEE } ``` --- ### 关键技巧解析 #### 1️⃣ **状态机模式** ```java // 使用示例 BattleState currentState = BattleState.IDLE; // 玩家移动触发事件 currentState = currentState.handleEvent(GameEvent.PLAYER_MOVE); System.out.println(currentState.getChineseName()); // 输出:备战 // 开始战斗 currentState = currentState.handleEvent(GameEvent.BATTLE_START); System.out.println(currentState.canAttack()); // 输出:true ``` #### 2️⃣ **差异化方法实现** ```java // 不同状态对同一方法有不同实现 BattleState.IDLE.canAttack(); // false BattleState.FIGHTING.canAttack(); // true ``` #### 3️⃣ **流式API整合** ```java // 获取所有允许攻击的状态 List<BattleState> combatStates = BattleState.getCombatStates(); // 结果:[PREPARE, FIGHTING] ``` #### 4️⃣ **类型安全转换** ```java // 编译器会检查所有枚举项是否覆盖抽象方法 // 如果新增枚举项忘记实现handleEvent(),编译直接报错 ``` --- ### 实际应用场景 1. **游戏存档系统** 序列化时只需存储枚举名称,恢复时通过`valueOf()`还原 2. **AI决策树** ```java if (currentState == BattleState.PREPARE) { ai.prepareDefense(); } ``` 3. **状态持续时间校验** ```java boolean isTimeout = duration > currentState.getMaxDuration(); ``` 4. **UI状态绑定** ```java button.setEnabled(currentState.canAttack()); ``` --- ### 枚举类优势总结 | 特性 | 传统方案 | 枚举方案 | |---------------------|----------------------------|----------------------------| | **状态合法性** | 可能传入非法int值 | 编译器保证类型安全 | | **行为扩展** | 需要大量if-else判断 | 各状态独立实现逻辑 | | **可读性** | 数字/字符串常量难以理解 | 见名知意(`VICTORY`比数字2清晰)| | **维护性** | 修改常量影响多处 | 只需修改对应枚举项 | --- 下次遇到需要管理状态流转、限制输入范围、实现差异化行为的场景,记得掏出枚举类这把瑞士军刀!如果需要更贴近某个具体业务场景的案例,可以随时告诉我哦 🎮
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值