digitalmars.D.learn - Sorting array of string arrays by an element in the string array
- neal (8/8) Oct 21 2014 Just curious if this is possible. I have some data on different
- Joel (3/11) Oct 21 2014 More like this:
- Joel (3/17) Oct 21 2014 Oops, forgot the quotes: sort!("a.country >
- bearophile (5/6) Oct 21 2014 Something like this, perhaps?
- neal (27/33) Oct 21 2014 Hmmm.. Im getting some interesting results here. So when i put
- neal (6/43) Oct 21 2014 Wow sorry I just realized my mistake. the array is an array of
- bearophile (7/10) Oct 22 2014 That converts string->int many more than once for each string. So
- Neal (4/15) Oct 22 2014 Interesting! Thank you. Memory isn't a problem but I would still
- bearophile (7/11) Oct 22 2014 Unfortunately currently the sort-decorate-undercorate in Phobos
Just curious if this is possible. I have some data on different countries that i have stored in a multidimensional array called data[][]. What I want to do is sort data[][] by population which happens to be stored in data[i][4] where i is the index to iterate from country to country. I would like something like this: sort!("a>b")(data[][4]); Anybody have any suggestions?
Oct 21 2014
On Wednesday, 22 October 2014 at 00:32:56 UTC, neal wrote:Just curious if this is possible. I have some data on different countries that i have stored in a multidimensional array called data[][]. What I want to do is sort data[][] by population which happens to be stored in data[i][4] where i is the index to iterate from country to country. I would like something like this: sort!("a>b")(data[][4]); Anybody have any suggestions?More like this: sort!(a.country > b.country)(data[][4]);
Oct 21 2014
On Wednesday, 22 October 2014 at 00:36:22 UTC, Joel wrote:On Wednesday, 22 October 2014 at 00:32:56 UTC, neal wrote:Oops, forgot the quotes: sort!("a.country > b.country")(data[][4]);Just curious if this is possible. I have some data on different countries that i have stored in a multidimensional array called data[][]. What I want to do is sort data[][] by population which happens to be stored in data[i][4] where i is the index to iterate from country to country. I would like something like this: sort!("a>b")(data[][4]); Anybody have any suggestions?More like this: sort!(a.country > b.country)(data[][4]);
Oct 21 2014
neal:Anybody have any suggestions?Something like this, perhaps? data.sort!q{ a[4] > b[4] }; Bye, bearophile
Oct 21 2014
On Wednesday, 22 October 2014 at 01:02:17 UTC, bearophile wrote:neal:Hmmm.. Im getting some interesting results here. So when i put all of the populations in an area and used this code: sort!("a>b")(population); writeln("Top 5 population in 1993: "); for(int i = 0; i < 5;i++) writeln(population[i]); I get: Top 5 population in 1993: 1189550675 916529257 264493898 191658591 156810428 The problem there is that i lose the country that the population is associated with (the top one being China). When I run your code: data.sort!q{ a[4] > b[4] }; for(int i = 0; i < 5; i++) writeln(data[][]); I get this result for the top 5: ["Portugal", "1593140", "-668536", "1993", "9993683", "8"] ["Anguilla", "114", "-536", "1993", "9865", "10"] ["Malawi", "31745", "-25289", "1993", "9862531", "6"] ["Grenada", "2274", "-4890", "1993", "96908", "2"] ["Burkina Faso", "22613", "-38738", "1993", "9688261", "6"] Notice that the top populations arent correct.Anybody have any suggestions?Something like this, perhaps? data.sort!q{ a[4] > b[4] }; Bye, bearophile
Oct 21 2014
On Wednesday, 22 October 2014 at 01:58:19 UTC, neal wrote:On Wednesday, 22 October 2014 at 01:02:17 UTC, bearophile wrote:Wow sorry I just realized my mistake. the array is an array of strings! data.sort!q{ to!int(a[4]) > to!int(b[4]) }; This code fixes my problem! Thanks for the quick responses guys. you rock!neal:Hmmm.. Im getting some interesting results here. So when i put all of the populations in an area and used this code: sort!("a>b")(population); writeln("Top 5 population in 1993: "); for(int i = 0; i < 5;i++) writeln(population[i]); I get: Top 5 population in 1993: 1189550675 916529257 264493898 191658591 156810428 The problem there is that i lose the country that the population is associated with (the top one being China). When I run your code: data.sort!q{ a[4] > b[4] }; for(int i = 0; i < 5; i++) writeln(data[][]); I get this result for the top 5: ["Portugal", "1593140", "-668536", "1993", "9993683", "8"] ["Anguilla", "114", "-536", "1993", "9865", "10"] ["Malawi", "31745", "-25289", "1993", "9862531", "6"] ["Grenada", "2274", "-4890", "1993", "96908", "2"] ["Burkina Faso", "22613", "-38738", "1993", "9688261", "6"] Notice that the top populations arent correct.Anybody have any suggestions?Something like this, perhaps? data.sort!q{ a[4] > b[4] }; Bye, bearophile
Oct 21 2014
neal:data.sort!q{ to!int(a[4]) > to!int(b[4]) }; This code fixes my problem! Thanks for the quick responses guys. you rock!That converts string->int many more than once for each string. So if memory is not a problem, consider using a decorate-sort-undecorate pattern: data.schwartzSort!q{ a[4].to!int }; Bye, bearophile
Oct 22 2014
On Wednesday, 22 October 2014 at 07:38:01 UTC, bearophile wrote:neal:Interesting! Thank you. Memory isn't a problem but I would still like to learn how to write more efficient programs. If i posted my code would you be able to give me some advice?data.sort!q{ to!int(a[4]) > to!int(b[4]) }; This code fixes my problem! Thanks for the quick responses guys. you rock!That converts string->int many more than once for each string. So if memory is not a problem, consider using a decorate-sort-undecorate pattern: data.schwartzSort!q{ a[4].to!int }; Bye, bearophile
Oct 22 2014
Neal:Interesting! Thank you. Memory isn't a problemUnfortunately currently the sort-decorate-undercorate in Phobos is not very fast.but I would still like to learn how to write more efficient programs. If i posted my code would you be able to give me some advice?There is far more than just me around here. If you post code, someone usually can write come comment. Bye, bearophile
Oct 22 2014