Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I reverse a String in Dart?

I have a String, and I would like to reverse it. For example, I am writing an AngularDart filter that reverses a string. It's just for demonstration purposes, but it made me wonder how I would reverse a string.

Example:

Hello, world 

should turn into:

dlrow ,olleH 

I should also consider strings with Unicode characters. For example: 'Ame\u{301}lie'

What's an easy way to reverse a string, even if it has?

like image 990
Seth Ladd Avatar asked Feb 03 '14 07:02

Seth Ladd


People also ask

How do you reverse something in a string?

Strings can be reversed using slicing. To reverse a string, we simply create a slice that starts with the length of the string, and ends at index 0. The slice statement means start at string length, end at position 0, move with the step -1 (or one step backward).

How do you print a reverse number in darts?

Dart has a reversed method which is used to reverse a List. First, we convert the string into a list and then reverse the list and then convert the list into the string by joining it using the List. join( ) method.


2 Answers

The question is not well defined. Reversing arbitrary strings does not make sense and will lead to broken output. The first (surmountable) obstacle is Utf-16. Dart strings are encoded as Utf-16 and reversing just the code-units leads to invalid strings:

var input = "Music \u{1d11e} for the win"; // Music 𝄞 for the win print(input.split('').reversed.join()); // niw eht rof 

The split function explicitly warns against this problem (with an example):

Splitting with an empty string pattern ('') splits at UTF-16 code unit boundaries and not at rune boundaries[.]

There is an easy fix for this: instead of reversing the individual code-units one can reverse the runes:

var input = "Music \u{1d11e} for the win"; // Music 𝄞 for the win print(new String.fromCharCodes(input.runes.toList().reversed)); // niw eht rof 𝄞 cisuM 

But that's not all. Runes, too, can have a specific order. This second obstacle is much harder to solve. A simple example:

var input =  'Ame\u{301}lie'; // Amélie print(new String.fromCharCodes(input.runes.toList().reversed)); // eiĺemA 

Note that the accent is on the wrong character.

There are probably other languages that are even more sensitive to the order of individual runes.

If the input has severe restrictions (for example being Ascii, or Iso Latin 1) then reversing strings is technically possible. However, I haven't yet seen a single use-case where this operation made sense.

Using this question as example for showing that strings have List-like operations is not a good idea, either. Except for few use-cases, strings have to be treated with respect to a specific language, and with highly complex methods that have language-specific knowledge.

In particular native English speakers have to pay attention: strings can rarely be handled as if they were lists of single characters. In almost every other language this will lead to buggy programs. (And don't get me started on toLowerCase and toUpperCase ...).

like image 84
Florian Loitsch Avatar answered Sep 23 '22 21:09

Florian Loitsch


Here's one way to reverse an ASCII String in Dart:

input.split('').reversed.join(''); 
  1. split the string on every character, creating an List
  2. generate an iterator that reverses a list
  3. join the list (creating a new string)

Note: this is not necessarily the fastest way to reverse a string. See other answers for alternatives.

Note: this does not properly handle all unicode strings.

like image 30
Seth Ladd Avatar answered Sep 25 '22 21:09

Seth Ladd