如何根据 D 中的数组有条件地创建 class 参数数组?
How do I conditionally create an array of class parameters from an array in D?
假设我有一个包含一堆 class 实例的关联数组。我想找到一种惯用的 D 方法来创建一个数组(或范围),其中包含属于数组中 class 实例的属性,这意味着一些布尔条件。
参见下面的示例,在这种情况下,我想创建一个包含五年级学生年龄的数组或范围。
我知道如何使用循环和条件执行此操作,但如果在 D 中有内置函数或惯用方法来执行此操作,那将非常有帮助。
import std.stdio;
class Student {
private:
uint grade;
uint age;
uint year;
public:
this(uint g, uint a, uint y) {
grade = g;
age = a;
year = y;
}
uint getAge() {
return age;
}
uint getGrade() {
return grade;
}
uint getYear() {
return year;
}
}
void main() {
Student[uint] classroom;
Student s1 = new Student(1, 5, 2);
Student s2 = new Student(2, 6, 1);
Student s3 = new Student(3, 7, 2);
Student s4 = new Student(4, 8, 9);
classroom[1] = s1;
classroom[2] = s1;
classroom[3] = s1;
classroom[4] = s1;
// I want to generate an array or range here containing the age of students who are in the X'th grade
}
std.algorithm 支持你:
import std.algorithm, std.array;
auto kids = classroom.values
.filter!(student => student.grade == 5)
.array;
如果你想一次对每个年级都做这个,你需要先排序,然后再分块,比如:
classroom.values
.sort!((x, y) => x.grade < y.grade)
.chunkBy((x, y) => x.grade == y.grade)
这为您提供了[同年级学生的范围]。
您只需要在 std.algorithm 模块的帮助下进行一点函数式编程:
import std.stdio;
import std.algorithm, std.array;
class Student {
private:
uint grade;
uint age;
uint year;
public:
this(uint g, uint a, uint y) {
grade = g;
age = a;
year = y;
}
uint getAge() {
return age;
}
uint getGrade() {
return grade;
}
uint getYear() {
return year;
}
}
void main() {
Student[uint] classroom;
Student s1 = new Student(1, 5, 2);
Student s2 = new Student(2, 6, 1);
Student s3 = new Student(3, 7, 2);
Student s4 = new Student(4, 8, 9);
classroom[1] = s1;
classroom[2] = s2;
classroom[3] = s3;
classroom[4] = s4;
classroom[5] = new Student(3, 8, 3);
// I want to generate an array or range here containing the age of students who are in the X'th grade
uint grd = 3;
auto ages = classroom.values
.filter!(student => student.getGrade() == grd)
.map!(student => student.getAge());
writeln(ages);
uint[] arr = ages.array; // if you need to turn the range into an array
writeln(arr); // prints the same as above
}
假设我有一个包含一堆 class 实例的关联数组。我想找到一种惯用的 D 方法来创建一个数组(或范围),其中包含属于数组中 class 实例的属性,这意味着一些布尔条件。
参见下面的示例,在这种情况下,我想创建一个包含五年级学生年龄的数组或范围。
我知道如何使用循环和条件执行此操作,但如果在 D 中有内置函数或惯用方法来执行此操作,那将非常有帮助。
import std.stdio;
class Student {
private:
uint grade;
uint age;
uint year;
public:
this(uint g, uint a, uint y) {
grade = g;
age = a;
year = y;
}
uint getAge() {
return age;
}
uint getGrade() {
return grade;
}
uint getYear() {
return year;
}
}
void main() {
Student[uint] classroom;
Student s1 = new Student(1, 5, 2);
Student s2 = new Student(2, 6, 1);
Student s3 = new Student(3, 7, 2);
Student s4 = new Student(4, 8, 9);
classroom[1] = s1;
classroom[2] = s1;
classroom[3] = s1;
classroom[4] = s1;
// I want to generate an array or range here containing the age of students who are in the X'th grade
}
std.algorithm 支持你:
import std.algorithm, std.array;
auto kids = classroom.values
.filter!(student => student.grade == 5)
.array;
如果你想一次对每个年级都做这个,你需要先排序,然后再分块,比如:
classroom.values
.sort!((x, y) => x.grade < y.grade)
.chunkBy((x, y) => x.grade == y.grade)
这为您提供了[同年级学生的范围]。
您只需要在 std.algorithm 模块的帮助下进行一点函数式编程:
import std.stdio;
import std.algorithm, std.array;
class Student {
private:
uint grade;
uint age;
uint year;
public:
this(uint g, uint a, uint y) {
grade = g;
age = a;
year = y;
}
uint getAge() {
return age;
}
uint getGrade() {
return grade;
}
uint getYear() {
return year;
}
}
void main() {
Student[uint] classroom;
Student s1 = new Student(1, 5, 2);
Student s2 = new Student(2, 6, 1);
Student s3 = new Student(3, 7, 2);
Student s4 = new Student(4, 8, 9);
classroom[1] = s1;
classroom[2] = s2;
classroom[3] = s3;
classroom[4] = s4;
classroom[5] = new Student(3, 8, 3);
// I want to generate an array or range here containing the age of students who are in the X'th grade
uint grd = 3;
auto ages = classroom.values
.filter!(student => student.getGrade() == grd)
.map!(student => student.getAge());
writeln(ages);
uint[] arr = ages.array; // if you need to turn the range into an array
writeln(arr); // prints the same as above
}