Jump to page: 1 2
Thread overview
Why std.algorithm.sort can't be applied to char[]?
May 12, 2014
hane
May 12, 2014
John Colvin
May 12, 2014
John Colvin
May 13, 2014
hane
May 12, 2014
Jonathan M Davis
May 12, 2014
Charles Hixson
May 12, 2014
Jonathan M Davis
May 14, 2014
monarch_dodra
May 14, 2014
bearophile
May 14, 2014
John Colvin
May 15, 2014
monarch_dodra
May 14, 2014
Jonathan M Davis
May 15, 2014
monarch_dodra
May 15, 2014
monarch_dodra
May 12, 2014
and is there any way to sort char array with algorithm.sort?
---
import std.algorithm;
import std.range;

void main()
{
  int[] arr = [5, 3, 7];
  sort(arr); // OK

  char[] arr2 = ['z', 'g', 'c'];
  sort(arr2); // error
  sort!q{ a[0] > b[0] }(zip(arr, arr2)); // error
}
---
I don't know what's difference between int[] and char[] in D, but it's very unnatural.
May 12, 2014
On Monday, 12 May 2014 at 14:49:53 UTC, hane wrote:
> and is there any way to sort char array with algorithm.sort?
> ---
> import std.algorithm;
> import std.range;
>
> void main()
> {
>   int[] arr = [5, 3, 7];
>   sort(arr); // OK
>
>   char[] arr2 = ['z', 'g', 'c'];
>   sort(arr2); // error
>   sort!q{ a[0] > b[0] }(zip(arr, arr2)); // error
> }
> ---
> I don't know what's difference between int[] and char[] in D, but it's very unnatural.

char[] is a rather special type of array: the language has unicode support and iterates over it by code-point (i.e. not guaranteed to be a single char per iteration).

If you want to sort chars and are assuming ASCII, you can just use std.string.representation to work with them as integer types:

import std.algorithm;
import std.range;
import std.string;

void main()
{
  int[] arr = [5, 3, 7];
  sort(arr); // OK

  char[] arr2 = ['z', 'g', 'c'];
  sort(arr2.representation); // error
  sort!q{ a[0] > b[0] }(zip(arr, arr2.representation)); // error
}
May 12, 2014
On Monday, 12 May 2014 at 14:56:46 UTC, John Colvin wrote:
> On Monday, 12 May 2014 at 14:49:53 UTC, hane wrote:
>> and is there any way to sort char array with algorithm.sort?
>> ---
>> import std.algorithm;
>> import std.range;
>>
>> void main()
>> {
>>  int[] arr = [5, 3, 7];
>>  sort(arr); // OK
>>
>>  char[] arr2 = ['z', 'g', 'c'];
>>  sort(arr2); // error
>>  sort!q{ a[0] > b[0] }(zip(arr, arr2)); // error
>> }
>> ---
>> I don't know what's difference between int[] and char[] in D, but it's very unnatural.
>
> char[] is a rather special type of array: the language has unicode support and iterates over it by code-point (i.e. not guaranteed to be a single char per iteration).
>
> If you want to sort chars and are assuming ASCII, you can just use std.string.representation to work with them as integer types:
>
> import std.algorithm;
> import std.range;
> import std.string;
>
> void main()
> {
>   int[] arr = [5, 3, 7];
>   sort(arr); // OK
>
>   char[] arr2 = ['z', 'g', 'c'];
>   sort(arr2.representation); // error
>   sort!q{ a[0] > b[0] }(zip(arr, arr2.representation)); // error
> }

woops, should have deleted the // error comments
May 12, 2014
On Mon, 12 May 2014 14:49:52 +0000
hane via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote:

> and is there any way to sort char array with algorithm.sort?
> ---
> import std.algorithm;
> import std.range;
>
> void main()
> {
>    int[] arr = [5, 3, 7];
>    sort(arr); // OK
>
>    char[] arr2 = ['z', 'g', 'c'];
>    sort(arr2); // error
>    sort!q{ a[0] > b[0] }(zip(arr, arr2)); // error
> }
> ---
> I don't know what's difference between int[] and char[] in D, but it's very unnatural.

All strings in D are treated as ranges of dchar, not their element type. This has to with the fact that a char or wchar are only part of a character. If you want to sort arrays of characters, you need to use dchar[].

http://stackoverflow.com/questions/12288465 http://stackoverflow.com/questions/16590650

- Jonathan M Davis
May 12, 2014
On 05/12/2014 09:29 AM, Jonathan M Davis via Digitalmars-d-learn wrote:
> On Mon, 12 May 2014 14:49:52 +0000
> hane via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote:
>
>> and is there any way to sort char array with algorithm.sort?
>> ---
>> import std.algorithm;
>> import std.range;
>>
>> void main()
>> {
>>     int[] arr = [5, 3, 7];
>>     sort(arr); // OK
>>
>>     char[] arr2 = ['z', 'g', 'c'];
>>     sort(arr2); // error
>>     sort!q{ a[0] > b[0] }(zip(arr, arr2)); // error
>> }
>> ---
>> I don't know what's difference between int[] and char[] in D, but
>> it's very unnatural.
> All strings in D are treated as ranges of dchar, not their element type. This
> has to with the fact that a char or wchar are only part of a character. If you
> want to sort arrays of characters, you need to use dchar[].
>
> http://stackoverflow.com/questions/12288465
> http://stackoverflow.com/questions/16590650
>
> - Jonathan M Davis
>
Given that he was working with pure ASCII, he should be able to cast the array to byte[] and sort it, but I haven't tried.  Also char[] isn't string.  Strings are immutable, and thus cannot be sorted in place.  To me this looks like an error in sort that he should be able to work around with a cast.

-- 
Charles Hixson

May 12, 2014
On Mon, 12 May 2014 11:08:47 -0700
Charles Hixson via Digitalmars-d-learn
<digitalmars-d-learn@puremagic.com> wrote:

> On 05/12/2014 09:29 AM, Jonathan M Davis via Digitalmars-d-learn wrote:
> > On Mon, 12 May 2014 14:49:52 +0000
> > hane via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com>
> > wrote:
> >
> >> and is there any way to sort char array with algorithm.sort?
> >> ---
> >> import std.algorithm;
> >> import std.range;
> >>
> >> void main()
> >> {
> >>     int[] arr = [5, 3, 7];
> >>     sort(arr); // OK
> >>
> >>     char[] arr2 = ['z', 'g', 'c'];
> >>     sort(arr2); // error
> >>     sort!q{ a[0] > b[0] }(zip(arr, arr2)); // error
> >> }
> >> ---
> >> I don't know what's difference between int[] and char[] in D, but it's very unnatural.
> > All strings in D are treated as ranges of dchar, not their element type. This has to with the fact that a char or wchar are only part of a character. If you want to sort arrays of characters, you need to use dchar[].
> >
> > http://stackoverflow.com/questions/12288465 http://stackoverflow.com/questions/16590650
> >
> > - Jonathan M Davis
> >
> Given that he was working with pure ASCII, he should be able to cast the array to byte[] and sort it, but I haven't tried.

Sure, you can cast char[] to ubyte[] and sort that if you know that the array only holds pure ASCII. In fact, you can use std.string.representation to do it - e.g.

auto ascii = str.representation;

and if str were mutable, then you could sort it. But that will only work if the string only contains ASCII characters. Regardless, he wanted to know why he couldn't sort char[], and I explained why - all strings are treated as ranges of dchar, making it so that if their element type is char or wchar, so they're not random access and thus can't be sorted.

> Also char[] isn't string.

Yes, string is aliased to immutable(string)[], but char[] is still a string type, and what I said applies to all string types. In particular, arrays of char or wchar are called "narrow strings," because it's not guaranteed that one of their code units is a full code point, unlike arrays of dchar. But all arrays of char, wchar, or dchar are strings.

> Strings are immutable, and thus cannot be sorted in place.

"string" is immutable and thus couldn't be sorted regardless of whether narrow strings were treated as ranges of dchar or not, but char[] is a string just as much as immutable(char)[] is. It's just not string.

- Jonathan M Davis
May 13, 2014
On Monday, 12 May 2014 at 14:56:46 UTC, John Colvin wrote:
> char[] is a rather special type of array: the language has unicode support and iterates over it by code-point (i.e. not guaranteed to be a single char per iteration).
>
> If you want to sort chars and are assuming ASCII, you can just use std.string.representation to work with them as integer types:

On Monday, 12 May 2014 at 16:30:12 UTC, Jonathan M Davis via Digitalmars-d-learn wrote:
> All strings in D are treated as ranges of dchar, not their element type. This
> has to with the fact that a char or wchar are only part of a character. If you
> want to sort arrays of characters, you need to use dchar[].

I understand the reason. Thanks!
May 14, 2014
On Monday, 12 May 2014 at 18:44:22 UTC, Jonathan M Davis via Digitalmars-d-learn wrote:
> Sure, you can cast char[] to ubyte[] and sort that if you know that the array
> only holds pure ASCII. In fact, you can use std.string.representation to do it
> - e.g.
>
> auto ascii = str.representation;
>
> and if str were mutable, then you could sort it. But that will only work if
> the string only contains ASCII characters. Regardless, he wanted to know why
> he couldn't sort char[], and I explained why - all strings are treated as
> ranges of dchar, making it so that if their element type is char or wchar, so
> they're not random access and thus can't be sorted.

Arguably, a smart enough implementation should know how to sort a "char[]", while still preserving codepoint integrity.

As a matter of fact, the built in "sort" property does it.

void main()
{
    char[] s = "éöeèûà".dup;
    s.sort;
    writeln(s);
}
//prints:
eàèéöû
May 14, 2014
monarch_dodra:

> As a matter of fact, the built in "sort" property does it.

It's going to be deprecated "soon".

Bye,
bearophile
May 14, 2014
On Wednesday, 14 May 2014 at 08:27:46 UTC, monarch_dodra wrote:
> On Monday, 12 May 2014 at 18:44:22 UTC, Jonathan M Davis via Digitalmars-d-learn wrote:
>> Sure, you can cast char[] to ubyte[] and sort that if you know that the array
>> only holds pure ASCII. In fact, you can use std.string.representation to do it
>> - e.g.
>>
>> auto ascii = str.representation;
>>
>> and if str were mutable, then you could sort it. But that will only work if
>> the string only contains ASCII characters. Regardless, he wanted to know why
>> he couldn't sort char[], and I explained why - all strings are treated as
>> ranges of dchar, making it so that if their element type is char or wchar, so
>> they're not random access and thus can't be sorted.
>
> Arguably, a smart enough implementation should know how to sort a "char[]", while still preserving codepoint integrity.
>
> As a matter of fact, the built in "sort" property does it.
>
> void main()
> {
>     char[] s = "éöeèûà".dup;
>     s.sort;
>     writeln(s);
> }
> //prints:
> eàèéöû

Why would anyone ever want to sort code-points?

They might want to sort graphemes, but that's difficult to do in-place (needs O(n) memory, I think...). If out-of-place is good enough

someStr.byGrapheme.array.sort();
« First   ‹ Prev
1 2