Flutter多维数组操作插件n_dimensional_array的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter多维数组操作插件n_dimensional_array的使用

n-Dimensional Array

n-Dimensional Array包是一个强大的工具,它赋予Flutter开发者创建和操作多维数组的能力。通过这个包,开发者可以轻松地在他们的应用程序中定义和操控n维数组。这个包提供了一个简单直观的接口来高效处理各种维度的数组。

Flutter Hue logo

安装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

1 回复

更多关于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('查看控制台输出以查看多维数组操作结果');
  }
}

解释

  1. 创建多维数组

    var nDArray = NDArray.create(shape: [2, 2, 2], fill: 0);
    

    这行代码创建了一个形状为[2, 2, 2]的三维数组,并用0填充。

  2. 设置数组中的值

    nDArray.set([0, 0, 0], 1);
    nDArray.set([1, 1, 1], 2);
    

    这两行代码分别设置了数组的第一个和最后一个元素的值。

  3. 打印数组内容: 使用三重嵌套循环遍历数组并打印每个元素的值。

  4. 切片操作

    var slice = nDArray.slice([0, null, null]);
    

    这行代码获取了数组的第一个二维数组切片(即z=0的平面)。

  5. 打印切片内容: 使用双重嵌套循环遍历切片并打印每个元素的值。

运行这个示例应用后,你将在控制台中看到多维数组及其切片的内容。这个示例展示了如何使用n_dimensional_array插件进行基本的数组创建、元素设置、遍历和切片操作。

回到顶部