digitalmars.D.learn - sort with =?UTF-8?B?Y2hhcuKAmXM=?=
- Joel (68/68) Aug 09 2023 An array of int’s works:
- Rene Zwanenburg (6/7) Aug 10 2023 This is one of those cases where autodecoding gets in the way.
- Joel (56/63) Aug 11 2023 Using byCodeUnit I get extra letters with the following code.
- Steven Schveighoffer (10/13) Aug 12 2023 This writes each character individually, and then at the end
An array of int’s works:
```d
import std;
struct List(T) {
class Node {
T data;
Node next;
this(T data) {
this.data=data;
}
override string toString() const {
return data.to!string;
}
}
Node start;
this(T[] data...) {
void add(T data) {
auto newNode=new Node(data);
if (start is null)
start=newNode;
else {
auto cur=start;
while(cur.next) {
cur=cur.next;
}
cur.next=newNode;
}
}
data.each!(d => add(d));
}
int opApply(int delegate(ref T) dg) {
auto cur=start;
while(cur) {
int result=dg(cur.data);
if (result)
return result;
cur=cur.next;
}
return 0;
}
auto opIndex() {
return this.array;
}
}
void main() {
auto j=List!char("Joel".to!(char[]));
j.each!(c => write(c, " "));
writeln;
j[].sort!"a>b".each!(c => c.writeln);
auto i=List!int(1979,4,30);
writeln;
i[].sort!"a<b".each!(n => n.writeln);
}
```
I get this:
```
onlineapp.d(49): Error: none of the overloads of template
`std.algorithm.sorting.sort` are callable using argument types
`!("a>b")(char[])`
/dlang/dmd/linux/bin64/../../src/phobos/std/algorithm/sorting.d(1925):
Candidate is: `sort(alias less = "a < b", SwapStrategy ss =
SwapStrategy.unstable, Range)(Range r)`
with `less = "a>b",
ss = SwapStrategy.unstable,
Range = char[]`
must satisfy one of the following constraints:
` hasSwappableElements!Range
hasAssignableElements!Range
ss != SwapStrategy.unstable`
```
Aug 09 2023
On Thursday, 10 August 2023 at 01:43:32 UTC, Joel wrote:An array of int’s works:This is one of those cases where autodecoding gets in the way. You can disable it using byCodeUnit, like this: ```D j[].byCodeUnit.sort!"a>b".each!(c => c.writeln); ```
Aug 10 2023
On Thursday, 10 August 2023 at 12:12:41 UTC, Rene Zwanenburg wrote:On Thursday, 10 August 2023 at 01:43:32 UTC, Joel wrote:Using byCodeUnit I get extra letters with the following code. ```d import std; struct List(T) { class Node { T data; Node next; this(T data) { this.data=data; } override string toString() const { return data.to!string; } } Node root; this(T[] data...) { void add(T data) { auto newNode=new Node(data); if (root is null) root=newNode; else { auto cur=root; while(cur.next) { cur=cur.next; } cur.next=newNode; } } data.each!(d => add(d)); } int opApply(scope int delegate(ref T) dg) { auto cur=root; while(cur) { int result=dg(cur.data); if (result) return result; cur=cur.next; } return 0; } auto opIndex() { static if (is(T==char)) return this.array.byCodeUnit; else return this.array; } } void main() { auto sirname="christensen"; auto name=List!char(sirname.to!(char[])); writeln(name[].each!(n => n.write)); // get "christensenyes" //, " <> ", name[].sort!"a>b".each!(n => n.write)); } ```An array of int’s works:This is one of those cases where autodecoding gets in the way. You can disable it using byCodeUnit, like this: ```D j[].byCodeUnit.sort!"a>b".each!(c => c.writeln); ```
Aug 11 2023
On Saturday, 12 August 2023 at 06:47:50 UTC, Joel wrote:
writeln(name[].each!(n => n.write)); // get
"christensenyes" //, " <> ", name[].sort!"a>b".each!(n =>
n.write));
This writes each character individually, and then at the end
writes the result of `each` with a newline.
In this case, `each`
[docs](https://dlang.org/phobos/std_algorithm_iteration.html#each) say:
Returns:
Yes.each if the entire range was iterated, No.each in case of
early stopping.
`Yes.each` is going to print as "yes".
-Steve
Aug 12 2023








Steven Schveighoffer <schveiguy gmail.com>