[Gambas-user] Sort multidimensional array?
Tobias Boege
taboege at ...626...
Tue Feb 7 00:30:52 CET 2017
On Mon, 06 Feb 2017, Riccardo wrote:
> Hi,
>
> Is it possible to use the array.sort() method on a two-dimensional array?
>
>
>
>
>
> > Public arr_Response As New String[][]
> >
>
>
>
>
> Specifically, I'd like to sort the entire array based on the contents of the second column something like: arr_Response[][1].sort() ...
>
You can call String[][].Sort() but the result will probably not be what you
expect. First of all, you have to understand how Gambas handles the type of
multi-dimensional array you're using. I have given more explanations of this
on this list and elsewhere than I can recount, but I'll do it another time.
(I'll type it out anew; search the mailing list archive if you want to see
previous versions of the explanation.)
The Gambas interpreter can derive array data types from any given data type
at runtime. Say "X" is any data type that's currently known to the interpreter
(at runtime), then, if you use "X[]" like a data type in your Gambas code,
the interpreter will notice that "X[]" is made of the known data type "X"
and a pair of brackets and use a code template to create and register a new
data type, which is "array of X". "X[]" is a data type created on the fly
for storing an array of objects of type "X".
The type "String[]" is built-in into the interpreter, but if you use
"String[][]", the mechanics desribed above are invoked. "String[][]" is a
new data type created from a code templates stored inside the interpreter.
This template is, if you care to look at the sources, is really just reusing
the methods of the "Object[]" class.
This means "String[][]" is an "Object[]" which expects to contain elements
of type "String[]" -- nothing more. This finally explains why
String[][].Sort() does not do anything sensible. Since the Sort() method
comes directly from the "Object[]" class, the sorting is done by comparing
memory addresses of the "String[]" elements. It does not look at the Strings
one layer further down.
So what about your problem? I would advise that you ditch the String[].
Define a new class "MyResponse" or something, so that you can declare your
array as
Public arr_Response As New MyResponse[]
The advantage is that in your own MyResponse class you can implement the
_compare() special method [1] to compare two MyResponse objects by using
the second field in the response array, as you originally intended.
After you implement the _compare() method, the Response[].Sort() method
will sort properly. See also this old project [2] in German, where we
demonstrate how to sort GridViews (vastly generic, but with some restrictions)
using the very same method. There, the column at which to sort can be
specified at runtime. Note that the version of the project on this site
uses a *bad practice* of inheriting Variant[] instead of creating your
own class. (There may be other shortcomings in that project which I don't
remember off-hand.)
Regards,
Tobi
[1] http://gambaswiki.org/wiki/lang/special/compare
[2] http://www.gambas-buch.de/dw/doku.php?id=k17:k17.7:k17.7.4:start
--
"There's an old saying: Don't change anything... ever!" -- Mr. Monk
More information about the User
mailing list