String 如何在Dart中反转字符串?
我有一个字符串,我想把它颠倒过来。例如,我正在编写一个用于反转字符串的AngularDart过滤器。这只是为了演示,但它让我想知道如何反转字符串 例如:String 如何在Dart中反转字符串?,string,flutter,dart,split,reverse,String,Flutter,Dart,Split,Reverse,我有一个字符串,我想把它颠倒过来。例如,我正在编写一个用于反转字符串的AngularDart过滤器。这只是为了演示,但它让我想知道如何反转字符串 例如: Hello, world 应变成: dlrow ,olleH 我也应该考虑使用Unicode字符的字符串。例如:'Ame\u{301}lie' 哪种简单的方法可以反转字符串,即使它有?以下是在Dart中反转ASCII字符串的一种方法: input.split('').reversed.join(''); 拆分每个字符上的字符串,创建一个列
Hello, world
应变成:
dlrow ,olleH
我也应该考虑使用Unicode字符的字符串。例如:
'Ame\u{301}lie'
哪种简单的方法可以反转字符串,即使它有?以下是在Dart中反转ASCII字符串的一种方法:
input.split('').reversed.join('');
字符串反转(字符串s){
var chars=s.splitChars();
var len=s.长度-1;
var i=0;
而(我
(或)
字符串反转(字符串s){
StringBuffer sb=新的StringBuffer();
对于(int i=s.length-1;i>=0;i--){
某人加上(s[i]);
}
使某人返回字符串();
}
main(){
打印(反面为“你好,世界”);
}
我为几个不同的备选方案制定了一个小型基准:
String reverse0(String s) {
return s.split('').reversed.join('');
}
String reverse1(String s) {
var sb = new StringBuffer();
for(var i = s.length - 1; i >= 0; --i) {
sb.write(s[i]);
}
return sb.toString();
}
String reverse2(String s) {
return new String.fromCharCodes(s.codeUnits.reversed);
}
String reverse3(String s) {
var sb = new StringBuffer();
for(var i = s.length - 1; i >= 0; --i) {
sb.writeCharCode(s.codeUnitAt(i));
}
return sb.toString();
}
String reverse4(String s) {
var sb = new StringBuffer();
var i = s.length - 1;
while (i >= 3) {
sb.writeCharCode(s.codeUnitAt(i-0));
sb.writeCharCode(s.codeUnitAt(i-1));
sb.writeCharCode(s.codeUnitAt(i-2));
sb.writeCharCode(s.codeUnitAt(i-3));
i -= 4;
}
while (i >= 0) {
sb.writeCharCode(s.codeUnitAt(i));
i -= 1;
}
return sb.toString();
}
String reverse5(String s) {
var length = s.length;
var charCodes = new List(length);
for(var index = 0; index < length; index++) {
charCodes[index] = s.codeUnitAt(length - index - 1);
}
return new String.fromCharCodes(charCodes);
}
main() {
var s = "Lorem Ipsum is simply dummy text of the printing and typesetting industry.";
time('reverse0', () => reverse0(s));
time('reverse1', () => reverse1(s));
time('reverse2', () => reverse2(s));
time('reverse3', () => reverse3(s));
time('reverse4', () => reverse4(s));
time('reverse5', () => reverse5(s));
}
该库包含一个围绕字符串的轻量级包装器,使字符串的行为类似于一个不可变的字符列表:
import 'package:more/iterable.dart';
void main() {
print(string('Hello World').reversed.join());
}
这个问题没有很好的定义。反转任意字符串没有意义,会导致输出中断。第一个(可克服的)障碍是Utf-16。Dart字符串编码为Utf-16,仅反转代码单位会导致无效字符串:
var input = "Music \u{1d11e} for the win"; // Music There is a utils package that covers this function. It has some more nice methods for operation on strings.
Install it with :
dependencies:
basic_utils: ^1.2.0
var input=“音乐\u{1d11e}赢取”//Music有一个utils软件包包含此功能。它有一些更好的字符串操作方法
安装时请使用:
String reverseStringUsingSplit(String input) {
var chars = input.split('');
return chars.reversed.join();
}
用法:
String reversed=StringUtils.reverse(“helloworld”);
Github:
在Dart中有很多方法可以反转字符串,下面给出了其中一些方法
使用拆分和联接:
String reverseStringUsingRunes(String input) {
var chars = input.runes.toList();
return String.fromCharCodes(chars.reversed);
}
String reverseStringUsingCodeUnits(String input) {
return String.fromCharCodes(input.codeUnits.reversed);
}
void main() {
var coflutter = 'Coflutter';
print(reverseStringUsingSplit(coflutter));
print(reverseStringUsingRunes(coflutter));
print(reverseStringUsingCodeUnits(coflutter));
}
使用符文:
String reverseStringUsingRunes(String input) {
var chars = input.runes.toList();
return String.fromCharCodes(chars.reversed);
}
String reverseStringUsingCodeUnits(String input) {
return String.fromCharCodes(input.codeUnits.reversed);
}
void main() {
var coflutter = 'Coflutter';
print(reverseStringUsingSplit(coflutter));
print(reverseStringUsingRunes(coflutter));
print(reverseStringUsingCodeUnits(coflutter));
}
使用代码单位:
String reverseStringUsingRunes(String input) {
var chars = input.runes.toList();
return String.fromCharCodes(chars.reversed);
}
String reverseStringUsingCodeUnits(String input) {
return String.fromCharCodes(input.codeUnits.reversed);
}
void main() {
var coflutter = 'Coflutter';
print(reverseStringUsingSplit(coflutter));
print(reverseStringUsingRunes(coflutter));
print(reverseStringUsingCodeUnits(coflutter));
}
您可以简单地使用像这样的所有方法
所有3种方法的输出都将是
Ref:这不是一种快速的方法,因为它创建了一个列表。如果你有一个大长度的字符串,它会创建许多字符串。输入字符串中每个代码单元一个字符串。这不是有效的方法。梅佐尼是对的:他的解决方案更简单、更快。谢谢。我会澄清我的回答不是为了最快的方式。@FlorianLoitsch我用上面的测试“Ame\u{301}lie”,结果是相反的。这失败的字符串是什么<代码>打印('Ame\u{301}lie'.split('').reversed.join('')代码>==>eiĺemA
这不是正确的倒数。重音在“l”而不是“e”。另外:这只是一个例子,符文需要按顺序排列。如果你有代理对,那就更糟了:“音乐为赢”。你能举个例子说明这一点吗。现在有很多答案对于许多输入来说都不正确,因为您没有指定具有严格限制的用例,所以反转字符串是有效的。到目前为止,没有一个答案能用简单的输入,比如'Ame\u{301}lie'
@FlorianLoitsch,我正在写一个角度滤波器作为演示。制作一个反转字符串的过滤器很简单。我将在问题中澄清我的用例是什么。这是因为在较高级别的答案中描述的原因而被打破的。我从这个简单的问答中学到了很多东西,现在我想知道toLowerCase
和toUpperCase
@André我认为他是说假设所有语言都有大写/小写他们性格的表现。。。类似于在表情符号UTF32代码中调用toLowerCase
,类似于\u{1d11e}@mFeinstein,它也可能是指类似的情况,这些情况可能会导致不正确的比较,具体取决于当地的希腊语:像ά∑ος这样的词在所有大写字母中都应该是∑∑∑∑∑∑(无变音),但Ά∑ος(带变音)在一句话的开头。不是一个大的加法,而是一个递减的for循环,而不是最后一个例子中的递增循环,理论上应该使它更快。最后一个是错误的。但是基准测试提供了有用的信息。太好了!time()方法?那是某种包装的吗?