Flutter多维数组操作插件n_dimensional_array的使用
Flutter多维数组操作插件n_dimensional_array的使用
n-Dimensional Array
n-Dimensional Array包是一个强大的工具,它赋予Flutter开发者创建和操作多维数组的能力。通过这个包,开发者可以轻松地在他们的应用程序中定义和操控n维数组。这个包提供了一个简单直观的接口来高效处理各种维度的数组。
安装Installation
在您的flutter项目的pubspec.yaml
文件中添加以下依赖项:
dependencies:
n_dimensional_array: ^1.0.3
将其导入到每个使用的文件中:
import 'package:n_dimensional_array/n_dimensional_array.dart';
使用Usage
示例 1 - 创建多维数组Create multi-dimensional array
此示例展示了如何使用三种不同的方法创建多维数组。
注意:每种方法都产生相同的结果。
List myList = [[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]];
// 方法 1 Method 1
NdArray ndArray1 = NdArray.fromList(myList);
// 方法 2 Method 2
NdArray ndArray2 = NdArray(3);
ndArray2.data = myList;
// 方法 3 Method 3
NdArray ndArray3 = NdArray(3);
ndArray3.reshape([3, 2, 2]);
ndArray3[0][0][0] = 1;
ndArray3[0][0][1] = 2;
ndArray3[0][1][0] = 3;
ndArray3[0][1][1] = 4;
ndArray3[1][0][0] = 5;
ndArray3[1][0][1] = 6;
ndArray3[1][1][0] = 7;
ndArray3[1][1][1] = 8;
ndArray3[2][0][0] = 9;
ndArray3[2][0][1] = 10;
ndArray3[2][1][0] = 11;
ndArray3[2][1][1] = 12;
示例 2 - 改变形状Reshape
与Dart中的普通列表一样,您不能超出列表长度添加元素。对于列表,您会使用add()
方法。扩展多维列表更复杂一些,因此创建了reshape
方法。
// 来自示例 1 的列表 The list from Example 1
List myList = [[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]];
NdArray ndArray = NdArray.fromList(myList);
// 当前形状是 [3, 2, 2]
List<int> shape = ndArray.shape;
// 在第3个维度添加一个元素
ndArray.reshape([3, 2, 3]);
// 注意:因为我们只改变第三个维度,我们可以选择调用:
// ndArray.reshape([-1, -1, 3]);
// `-1`作为一个占位符,原来的形状值将被使用。
// 现在列表看起来像这样:
// [[[1, 2, null], [3, 4, null]], [[5, 6, null], [7, 8, null]], [[9, 10, null], [11, 12, null]]];
// 缩小数组。
ndArray.reshape([1, 1, 2]);
// 现在列表看起来像这样:
// [[[1, 2]]]
// 注意:截断的数据丢失了。当缩小数组时要小心。确保这确实是您想要做的。
示例 3 - 获取和设置值Getting and Setting values
您可以像普通列表一样获取或设置值,其中您会调用myList[i]
。
// 2D 列表更容易理解 2D list is easier to follow
List myList = [[1, 2], [3, 4]];
NdArray ndArray = NdArray.fromList(myList);
// 一些当前值 Some current values
int value1 = ndArray[0][1]; // 2
int value2 = ndArray[1][1]; // 4
// 设置一个值 Set a value
ndArray[0][1] = 8;
value1 = ndArray[0][1]; // 8
// 现在列表看起来像这样:
// [[1, 8], [3, 4]]
示例 4 - 复制Copy
当您使用copy()
方法时,您创建一个新的NdArray
,它与原始的一模一样。对其中一个的任何修改都不会影响另一个。
注意:任何使用引用(如自定义对象)的非基本数据类型在复制时可能不会创建自己的新版本。如果是这种情况,对其中一个对象的更改将在两个NdArray
中显示。
// 2D 列表更容易理解 2D list is easier to follow
List myList = [[1, 2], [3, 4]];
NdArray ndArray = NdArray.fromList(myList);
NdArray ndArrayCopy = ndArray.copy();
// 只改变副本 Change only the copy
ndArrayCopy[0][0] = 99;
// 现在列表看起来像这样:
// ndArray.data == [[1, 2], [3, 4]]
// ndArrayCopy.data == [[99, 2], [3, 4]]
示例代码Demo Code
下面是一个完整的示例代码,演示了如何在Flutter项目中使用n_dimensional_array
库。
import 'package:flutter/material.dart';
import 'package:n_dimensional_array/n_dimensional_array.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late NdArray ndArray1d;
late NdArray ndArray2d;
late NdArray ndArray3d;
late NdArray ndArray4d;
late NdArray ndArray3dCopy;
@override
void initState() {
super.initState();
ndArray1d = NdArray.fromList([1, 2, 3, 4]);
ndArray2d = NdArray.fromList([[1, 2], [3, 4]]);
ndArray3d = NdArray.fromList([[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]]);
ndArray4d = NdArray.fromList([[[[1, 2], [3, 4]], [[5, 6], [7, 8]]], [[[9, 10], [11, 12]], [[13, 14], [15, 16]]]]);
// Original shape == [4]
ndArray1d.reshape([5]); // Add a level in the 1st dimension
// Original shape == [2, 2]
ndArray2d.reshape([2, 4]); // Add 2 levels in the 2nd dimension
// Original shape == [2, 2, 2]
ndArray3d.reshape([-1, -1, -1]); // Don't change the shape
// Original shape == [2, 2, 2, 2]
ndArray4d.reshape([2, 2, 2, 2]); // Remove 2 levels in the 1st dimension
// A copy of the original 3D array is returned.
ndArray3dCopy = ndArray3d.copy();
// Modify the original array
ndArray3d[0][0][0] = 100;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('n-Dimensional Array Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Original 3D Array Shape: ${ndArray3d.shape}'),
Text('Modified 3D Array Value at [0][0][0]: ${ndArray3d[0][0][0]}'),
Text('Copied 3D Array Shape: ${ndArray3dCopy.shape}'),
Text('Copied 3D Array Value at [0][0][0]: ${ndArray3dCopy[0][0][0]}'),
],
),
),
);
}
}
这段代码创建了一个简单的Flutter应用程序,展示了如何使用n_dimensional_array
库创建、操作和复制多维数组。在应用程序启动时,初始化了一些多维数组,并进行了形状调整和值修改的操作。UI部分仅用于展示部分操作结果。
更多关于Flutter多维数组操作插件n_dimensional_array的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter多维数组操作插件n_dimensional_array的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用n_dimensional_array
插件来处理多维数组的一个示例。首先,你需要确保已经添加了该插件到你的pubspec.yaml
文件中:
dependencies:
flutter:
sdk: flutter
n_dimensional_array: ^最新版本号 # 请替换为当前最新版本号
然后运行flutter pub get
来获取依赖。
接下来是一个简单的示例,展示如何使用n_dimensional_array
插件来创建和操作多维数组。
示例代码
import 'package:flutter/material.dart';
import 'package:n_dimensional_array/n_dimensional_array.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('多维数组操作示例'),
),
body: Center(
child: MultiDimensionalArrayExample(),
),
),
);
}
}
class MultiDimensionalArrayExample extends StatefulWidget {
@override
_MultiDimensionalArrayExampleState createState() => _MultiDimensionalArrayExampleState();
}
class _MultiDimensionalArrayExampleState extends State<MultiDimensionalArrayExample> {
@override
Widget build(BuildContext context) {
// 创建一个3维数组 (2x2x2)
var nDArray = NDArray.create(shape: [2, 2, 2], fill: 0);
// 打印数组形状
print('Array Shape: ${nDArray.shape}');
// 设置数组中的某个值
nDArray.set([0, 0, 0], 1);
nDArray.set([1, 1, 1], 2);
// 打印数组内容
print('Array Content:');
for (var i = 0; i < nDArray.shape[0]; i++) {
for (var j = 0; j < nDArray.shape[1]; j++) {
for (var k = 0; k < nDArray.shape[2]; k++) {
print('nDArray[$i][$j][$k] = ${nDArray.get([i, j, k])}');
}
}
}
// 对数组进行切片操作
var slice = nDArray.slice([0, null, null]); // 获取第一个二维数组切片
// 打印切片内容
print('Slice Content:');
for (var j = 0; j < slice.shape[0]; j++) {
for (var k = 0; k < slice.shape[1]; k++) {
print('slice[$j][$k] = ${slice.get([j, k])}');
}
}
return Text('查看控制台输出以查看多维数组操作结果');
}
}
解释
-
创建多维数组:
var nDArray = NDArray.create(shape: [2, 2, 2], fill: 0);
这行代码创建了一个形状为
[2, 2, 2]
的三维数组,并用0填充。 -
设置数组中的值:
nDArray.set([0, 0, 0], 1); nDArray.set([1, 1, 1], 2);
这两行代码分别设置了数组的第一个和最后一个元素的值。
-
打印数组内容: 使用三重嵌套循环遍历数组并打印每个元素的值。
-
切片操作:
var slice = nDArray.slice([0, null, null]);
这行代码获取了数组的第一个二维数组切片(即
z=0
的平面)。 -
打印切片内容: 使用双重嵌套循环遍历切片并打印每个元素的值。
运行这个示例应用后,你将在控制台中看到多维数组及其切片的内容。这个示例展示了如何使用n_dimensional_array
插件进行基本的数组创建、元素设置、遍历和切片操作。