Dart中Swift整数闭合范围(Closed Integer Range)的等效实现
Dart 中闭合整数范围的实现方案
一、官方第三方包的内置等效实现
Dart 标准库没有直接对应 Swift ClosedIntegerRange的类型,但官方维护的collection包提供了IntRange类,完全匹配你的需求:它实现了ClosedRange<int>接口,支持contains()方法校验值是否在范围内,同时可以通过start和end属性直接获取起止值。
使用步骤:
- 在
pubspec.yaml中添加依赖:
dependencies: collection: ^1.18.0
- 代码示例:
import 'package:collection/collection.dart'; void main() { // 模拟从JSON解析出的起止值 final start = 1; final end = 5; final range = IntRange(start, end); print(range.contains(3)); // 输出 true print(range.contains(6)); // 输出 false print(range.start); // 输出 1 print(range.end); // 输出 5 }
二、无依赖的高效自定义实现
如果不想引入外部包,自己实现一个轻量类是最高效的方案——无需额外内存开销,所有操作都是O(1)时间复杂度:
class ClosedIntRange { final int start; final int end; // 初始化时校验起止值的合理性 ClosedIntRange(this.start, this.end) : assert(start <= end, "起始值不能大于结束值"); // 校验值是否在闭合范围内 bool contains(int value) => value >= start && value <= end; } // 使用示例 void main() { final start = 2; final end = 7; final range = ClosedIntRange(start, end); print(range.contains(4)); // 输出 true print(range.contains(8)); // 输出 false print(range.start); // 输出 2 print(range.end); // 输出 7 }
三、借助集合实现的方案(不推荐)
虽然可以用List或Set模拟范围,但这种方式在范围较大时会创建大量元素,占用额外内存且性能低下,仅适合极小范围的临时场景:
// 不推荐的集合模拟方式 void main() { final start = 1; final end = 5; final rangeSet = Set<int>.from(List.generate(end - start + 1, (i) => start + i)); print(rangeSet.contains(3)); // 输出 true }
内容的提问来源于stack exchange,提问作者Awesomeplayer165
相关产品推荐
相关产品推荐

