Java除初始化指定长度外如何限制数组元素数量及元素取值范围
Java数组相关问题解答
问题1:如何限制数组长度在1~10之间
首先明确Java原生数组的特性:数组长度在初始化时就会固定,本身没有自带的长度合法性校验机制,你直接写int[] array = new int[28];必然会生成28长度的数组,不会自动触发你需要的长度限制。
你写的校验逻辑存在明显逻辑问题:while (array.length <= 1 && array.length >= 30) 永远无法成立,一个数值不可能同时满足小于等于1且大于等于30,且校验应该放在数组初始化之前执行,数组初始化完成后长度无法修改。
实现方式可以通过封装数组创建的工具方法统一校验:
/** * 创建长度限制在1~10之间的int数组 * @param expectLength 期望的数组长度 * @return 符合长度要求的数组 * @throws IllegalArgumentException 长度不符合要求时抛出异常 */ public static int[] createBoundedArray(int expectLength) throws IllegalArgumentException { // 校验长度合法性 if (expectLength < 1 || expectLength > 10) { throw new IllegalArgumentException("数组长度必须在1~10之间,当前输入长度:" + expectLength); } return new int[expectLength]; }
后续创建数组时统一调用该方法即可,比如int[] array = createBoundedArray(5); 就能保证生成的数组长度符合要求。
问题2:如何限制数组元素的取值范围
Java原生数组同样没有自带的元素取值校验能力,你可以根据使用场景选择两种实现方案:
方案1:临时校验(仅排序前检查)
如果只是需要在排序前判断是否存在大于等于100的元素,直接遍历数组做一次全量校验即可:
// 排序前校验元素合法性 for (int num : array) { if (num >= 100) { throw new IllegalArgumentException("存在大于等于100的非法元素,无法执行排序"); } } // 校验通过再执行排序 Arrays.sort(array);
方案2:封装数组类(全生命周期校验)
如果需要在数组元素赋值、修改的全流程都做取值限制,直接封装自定义数组类,对外只暴露经过校验的操作方法:
import java.util.Arrays; public class RestrictedIntArray { // 内部持有原生数组,不对外暴露 private final int[] array; // 初始化时先校验长度 public RestrictedIntArray(int length) { if (length < 1 || length > 10) { throw new IllegalArgumentException("数组长度必须在1~10之间"); } array = new int[length]; } // 赋值时校验元素取值 public void set(int index, int value) { if (value >= 100) { throw new IllegalArgumentException("数组元素不能大于等于100,当前输入值:" + value); } array[index] = value; } // 取值方法 public int get(int index) { return array[index]; } // 内置排序方法,执行前自动做元素校验 public void sort() { for (int num : array) { if (num >= 100) { throw new IllegalArgumentException("存在大于等于100的非法元素,无法执行排序"); } } Arrays.sort(array); } // 如需获取原生数组,返回拷贝避免外部直接修改内部数据 public int[] getRawArray() { return array.clone(); } }
另外你写的取值判断逻辑if (input <= 1 && input <= 150)存在逻辑错误,如果你要判断input在1~150的范围内,正确写法是if (input >= 1 && input <= 150)。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

