如何在 Dart 中逐个字符地迭代字符串?

问题描述 投票:0回答:9

我没有看到 Dart 字符串被视为字符列表。我假设我必须使用 for 循环,这会很蹩脚。

string list dictionary dart character
9个回答
72
投票

另一种实现(使用基本多语言平面之外的字符):

"A string".runes.forEach((int rune) {
  var character=new String.fromCharCode(rune);
  print(character);
});

37
投票

您还可以使用 split 方法 来生成

List
个字符。

input.split('').forEach((ch) => print(ch));

34
投票

不幸的是字符串目前不可迭代,所以你必须使用像这样的for循环

for(int i=0; i<s.length; i++) {
  var char = s[i];
}

请注意,Dart 没有字符类,因此 string[index] 将返回另一个字符串。


8
投票

使用 Flutter 角色类

import 'package:flutter/material.dart';
var characters = aString.characters;

3
投票

正确迭代

String
的扩展:

extension on String {

  /// To iterate a [String]: `"Hello".iterable()`
  Iterable<String> iterable() sync* {
    for (var i = 0; i < length; i++) {
      yield this[i];
    }}}

像这样使用它:

expect("Hello".iterable(), ["H", "e", "l", "l", "o"]);

但是,如果添加 Characters 包

import "package:characters/characters.dart"; 

然后您可以使用扩展来使用简单字符或 Unicode 字素正确迭代

String

extension on String {

  /// To iterate a [String]: `"Hello".iterable()`
  /// This will use simple characters. If you want to use Unicode Grapheme
  /// from the [Characters] library, passa [chars] true.
  Iterable<String> iterable({bool unicode = false}) sync* {
    if (unicode) {
      var iterator = Characters(this).iterator;
      while (iterator.moveNext()) {
        yield iterator.current;
      }
    } else
      for (var i = 0; i < length; i++) {
        yield this[i];
      }
  }
}

证明它有效:

  test('String.iterable()', () {
    expect("Hello".iterable(), ["H", "e", "l", "l", "o"]);
    expect("Hello".iterable(unicode: true), ["H", "e", "l", "l", "o"]);

    expect("😊".iterable().length, 2);
    expect("😊".iterable().map((s) => s.codeUnitAt(0)), [55357, 56842]);

    expect("😊".iterable(unicode: true).length, 1);
    expect("😊".iterable(unicode: true), ["😊"]);
  });

2
投票

extension on String {
  //toArray1 method
  List toArray1() {
    List items = [];
    for (var i = 0; i < this.length; i++) {
      items.add(this[i]);
    }
    return items;
  }

  //toArray2 method
  List toArray2() {
    List items = [];
    this.split("").forEach((item) => items.add(item));
    return items;
  }
}

main(List<String> args) {
  var str = "hello world hello world hello world hello world hello world";
  final stopwatch1 = Stopwatch()..start();
  print(str.toArray1());
  print('str.toArray1() executed in ${stopwatch1.elapsed}');

  final stopwatch2 = Stopwatch()..start();
  print(str.toArray2());
  print('str.toArray2() executed in ${stopwatch2.elapsed}');


}

上面是使用 for 循环和 foreach 的示例,但我测试的结果是,foreach 的运行速度比 for 循环快得多。抱歉,如果我错了,但这是我的测试。


1
投票

这也可以是解决方案:如果你觉得简单就使用它

String text = "findlastcharacter";
var array = text.split('');
array.forEach((element) { 
 print(element); // iterating char by char 
});
String lastchar = array[array.length - 1];
print('last char is = $lastchar'); // last char is = r

谢谢


0
投票
import 'package:characters/characters.dart';  
      
String myString = "Hi";
for (var char in myString.characters) {
   print(char);
}
H
i

如果您从字符开始,需要注意的一件事是它们将被转换为字符串。

Characters myCharacters = "Hi.characters".characters;      
for (var char in myCharacters) {
        assert(char is String);
        print(char);
}
H
i

0
投票

只是一个快速概述,您应该确实使用字符包:


import "package:characters/characters.dart";

main() {
  print("🧔‍♂️".characters);
  print("🧔‍♂️".characters.length);
  print("🧔‍♂️".runes);
  print("🧔‍♂️".runes.length);
  print("🧔‍♂️".codeUnits);
  print("🧔‍♂️".codeUnits.length);
}

将会输出

🧔‍♂️
1
(129492, 8205, 9794, 65039)
4
[55358, 56788, 8205, 9794, 65039]
5
© www.soinside.com 2019 - 2024. All rights reserved.