Flutter for OpenHarmony:more 极致算法与数据结构工具集(Dart 官方推荐的高效扩展) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:more 极致算法与数据结构工具集(Dart 官方推荐的高效扩展) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

在这里插入图片描述

前言

Flutter 和 Dart 的标准库提供了 List, Map, Set 以及基本的 Math 库。这对于普通 APP 开发够用了。
但是,如果你要开发:

  • 一个高性能的游戏引擎(需要位运算、四叉树)。
  • 一个复杂的数据分析工具(需要统计学算法)。
  • 一个缓存系统(需要 LRU 策略)。
  • 一个自定义的解析器(需要字符集处理)。

标准库就显得捉襟见肘了。

more 是 Dart 社区中质量极高的一个工具库(作者是 Google 工程师)。它汇集了大量高效的数据结构、数学算法、迭代器扩展和缓存策略。它的座右铭是“更多功能,更少废话”。

对于 OpenHarmony 应用,尤其是涉及高性能计算或复杂逻辑处理的场景,more 是你不可或缺的军火库。

一、核心功能概览

这个库包含了几十个独立的模块,列举几个最常用的:

  1. Collections: BiMap (双向映射), Multiset (多集), IntegerRange
  2. Cache: LruCache, FifoCache, ExpiryCache
  3. Math: Fraction (分数), Complex (复数), Polynomial (多项式), BitList
  4. CharMatcher: 类似于 Java Guava 的字符匹配器,高效处理字符串。
  5. Printers: 强大的对象打印/格式化工具。

导入

数据结构

算法

工具

文本

Dart 应用

package:more

BiMap, Multiset...

Statistics, Digits...

LRU, Expiry...

字符串处理

二、集成与用法详解

2.1 添加依赖

dependencies:more: ^4.7.0 

2.2 高效缓存 (Caching)

在鸿蒙开发中,为了优化性能,我们经常需要缓存计算结果或网络图片。more 提供了多种策略。

import'package:more/cache.dart';voidmain()async{// 创建一个容量为 100 的 LRU (Least Recently Used) 缓存// 当缓存满时,最近最少使用的数据会被剔除final cache =Cache<String, int>.lru(maxSize:100);// 加载数据 (如果不存在则调用 loader)final value =await cache.get('key',()async{print('正在计算...');return42;});print(value);// 42}
在这里插入图片描述

2.3 双向映射 (BiMap)

有时候我们需要通过 ID 查 Name,也需要通过 Name 查 ID。标准的 Map 只能单向查,BiMap 支持双向。

import'package:more/collection.dart';voidmain(){final bimap =BiMap<int,String>(); bimap[1]='一'; bimap[2]='二';print(bimap[1]);// 一print(bimap.inverse['二']);// 2}
在这里插入图片描述

2.4 迭代器魔法 (Iterables)

moreIterable 添加了大量扩展方法,类似于 RxDart 但同步执行。

import'package:more/iterable.dart';voidmain(){final list =[1,2,3,4,5];// 排列组合print(list.permutations(2));// ((1, 2), (1, 3), ...)// 窗口滑动print(list.window(2));// ([1, 2], [2, 3], [3, 4], [4, 5])// 无限生成器final fib =iterate(0,(a)=> a +1);// 0, 1, 2, ...}
在这里插入图片描述

三、OpenHarmony 适配与实战:本地数据处理

在鸿蒙设备上,有时我们需要在本地处理大量传感器数据或日志,而不需要上传云端。

3.1 场景:数据去重与统计

假设我们从加速度传感器采集了一串数据,包含大量重复值,我们需要统计每个值出现的次数。

import'package:more/collection.dart';voidprocessSensorData(List<int> rawData){// Multiset (即 Bag) 能够记录元素出现的次数final histogram =Multiset<int>(); histogram.addAll(rawData);// 打印出现次数最多的前 3 个值for(final value in histogram.distinct.take(3)){// 需配合排序逻辑print('Value $value -> Count: ${histogram[value]}');}}
在这里插入图片描述

3.2 场景:位图操作 (BitList)

在处理嵌入式协议或图片像素掩码时,List<bool> 太浪费内存了(一个 bool 占一个字节甚至更多)。BitList 用一个 bit 存一个 bool,极致省内存。

import'package:more/collection.dart';voidbitOperations(){// 创建一个包含 1024 位(128 字节)的位图final bits =BitList(1024); bits[10]=true; bits[100]=true;// 高效的位运算print(bits.test(10));// true// bits.setAll(...)}
在这里插入图片描述

四、功能详解:Printer

Printer 是 toString 的替代方案,能够组合式地格式化输出。

import'package:more/printer.dart';voidmain(){final printer =Printer.ofType<int>().padLeft(4,'0')// 补零.around('(',')');// 包裹print(printer(42));// (0042)}
在这里插入图片描述

五、总结

more 库正如其名,给了你更多。它填补了 Dart 基本库在高级数据结构和算法方面的空白。

对于 OpenHarmony 开发者:

  • 如果你在移植 Java (Guava/Commons-Lang) 或 Python 的代码到 Dart,你会发现 more 里有很多熟悉的面孔。
  • 它纯 Dart 实现,无任何平台依赖,是提升代码质量和性能的通用利器。

最佳实践

  1. 按需引入:虽然库包含很多功能,但它模块化做得很好。了解你真正需要的模块(如只用 Cache)。
  2. 性能优先:在处理成千上万条数据时,优先考虑 more 提供的数据结构(如位图、特定集合),可能会带来数量级的性能提升。

六、完整实战示例

import'package:more/collection.dart';import'package:more/math.dart';voidmain(){print('=== 数据统计算法 ===');// 模拟一组实验数据final data =[10,12,10,14,12,10,15,20];// 1. 统计频率 (Multiset)// 能够快速计算众数、频次final counts =Multiset<int>.from(data);// 找出出现次数最多的数字final mode = counts.distinct.reduce((a, b)=> counts[a]> counts[b]? a : b);print('数据: $data');print('众数 (Mode): $mode');print('数字 10 出现了 ${counts[10]} 次');print('\n=== 位操作 (BitList) ===');// 场景:签到系统,一年 365 天,每天只占 1 bit,极致省内存final checkIns =BitList(365); checkIns[0]=true;// 第1天签到 checkIns[5]=true;// 第6天签到print('由于存储压缩,365天签到数据仅占用: ${checkIns.length ~/8+1} 字节');print('第6天是否签到: ${checkIns[5]}');print('总签到天数: ${checkIns.count(true)}');print('\n=== 排列组合 (Combinations) ===');final teams =['红队','绿队','蓝队','黄队'];// 生成所有可能的两两对战组合 (C(n, 2))final matches = teams.combinations(2);print('赛程表:');for(var match in matches){print('${match.first} vs ${match.last}');}}
在这里插入图片描述

Read more

《算法闯关指南:优选算法--模拟》--43.数青蛙

《算法闯关指南:优选算法--模拟》--43.数青蛙

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 43. 数青蛙 * 解法(模拟+分情况讨论): * 算法思路: * C++算法代码: * 算法总结&&笔记展示: * 结尾: 前言: 聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找“最优解”。 递归与回溯:掌握问题分解与状态回退,攻克组合、排列等难题。 贪心算法:理解“局部最优”到“全局最优”的思路,解决区间调度等问题 内容以题带点,讲解思路与代码实现,帮助大家快速提升代码能力。 43. 数青蛙

By Ne0inhk
【大数据存储与管理】分布式文件系统HDFS:06 HDFS的数据读写过程

【大数据存储与管理】分布式文件系统HDFS:06 HDFS的数据读写过程

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈大数据技术原理与应用 ⌋ ⌋ ⌋专栏系统介绍大数据的相关知识,分为大数据基础篇、大数据存储与管理篇、大数据处理与分析篇、大数据应用篇。内容包含大数据概述、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数据库HBase、NoSQL数据库、云数据库、MapReduce、Hadoop再探讨、数据仓库Hive、Spark、流计算、Flink、图计算、数据可视化,以及大数据在互联网领域、生物医学领域的应用和大数据的其他应用。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/BigData_principle_application。 文章目录 * 一、读数据的过程 * 二、写数据的过程 * 小结 在介绍 HDFS 的数据读写过程之前,需要简单介绍一下相关的类。FileSystem 是一个通用文件系统的抽象基类,可以被分布式文件系统继承,所有可能使用

By Ne0inhk

深入浅出 PID 算法:原理、实现与应用实战

在工业控制、机器人运动控制、智能家居温控等场景中,PID 算法一直是当之无愧的 “控制利器”。它结构简单、鲁棒性强、参数调整灵活,即使在复杂的非线性系统中,也能实现稳定的闭环控制。本文将从原理到实战,带你彻底搞懂 PID 算法。 一、PID 算法是什么? PID 是 Proportional(比例)、Integral(积分)、Derivative(微分) 的缩写,它是一种闭环控制算法,核心思想是通过偏差(设定值与实际值的差值) 来计算控制量,从而让系统的实际输出无限接近设定值。 举个简单的例子:你想让空调把室温稳定在 25℃(设定值),但当前室温是 30℃(实际值),偏差就是 25-30 = -5℃。PID 控制器会根据这个偏差,自动调整空调的制冷功率,最终让室温稳定在 25℃。 PID 算法的核心公式(连续域)

By Ne0inhk
【leetcode】队列 + 宽搜,树形结构层序遍历的基础与变化

【leetcode】队列 + 宽搜,树形结构层序遍历的基础与变化

前言 🌟🌟本期讲解关于力扣的几篇题解的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-ZEEKLOG博客 🔥 你的点赞就是小编不断更新的最大动力                                        🎆那么废话不多说直接开整吧~~   目录 📚️1.N叉树的层序遍历 🚀1.1题目描述 🚀1.2思路讲解 🚀1.3题目代码 📚️2.二叉树锯齿形遍历 🚀2.1题目描述 🚀2.2思路讲解 🚀2.3题目代码 📚️3.二叉树最大宽度 🚀3.1题目描述 🚀3.2思路讲解 🚀3.3题目代码 📚️4.总结 📚️1.N叉树的层序遍历 🚀1.1题目描述 给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。 树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。 如下图所示: 输入:

By Ne0inhk