[systemd-devel] [PATCH 03/14] systemadm: display dependencies sorted
Zbigniew Jędrzejewski-Szmek
zbyszek at in.waw.pl
Mon Sep 19 16:15:58 PDT 2011
On 09/19/2011 07:34 PM, Maciej Marcin Piechotka wrote:
> On Mon, 2011-09-19 at 13:24 +0200, Zbigniew Jędrzejewski-Szmek wrote:
>> Maybe there's an easier way to sort strings in vala...
>
> In libgee the code would be:
>
> List<string> sorted = new ArrayList<string>();
> sorted.add_all (dependencies);
> sorted.sort ();
>
> Or:
>
> Collection<string> sorted = new TreeSet<string>();
> sorted.add_all (dependencies);
Hi,
thanks for the review! Indeed using gee makes this a bit simpler and
O(n log n), which should be OK, since n is on the order of tens.
Unfortunately the source (dependencies) is an array, not a Collection,
so add_all does not accept it and explicit looping is necessary.
An improved patch is below. I'll also push the changed version to my repo.
Best,
Zbyszek
---
src/systemadm.vala | 6 +++++-
1 files changed, 5 insertions(+), 1 deletions(-)
diff --git a/src/systemadm.vala b/src/systemadm.vala
index c893da0..088ba26 100644
--- src/systemadm.vala
+++ src/systemadm.vala
@@ -458,6 +458,10 @@ public class MainWindow : Window {
}
public string make_dependency_string(string? prefix, string
word, string[] dependencies) {
+ Gee.Collection<unowned string> sorted = new
Gee.TreeSet<string>();
+ foreach (string i in dependencies)
+ sorted.add(i);
+
bool first = true;
string r;
@@ -466,7 +470,7 @@ public class MainWindow : Window {
else
r = prefix;
- foreach (string i in dependencies) {
+ foreach (string i in sorted) {
if (r != "")
r += first ? "\n" : ",";
--
1.7.6
>> I admit
>> that this patch is not very pretty.
>> ---
>> src/systemadm.vala | 7 ++++++-
>> 1 files changed, 6 insertions(+), 1 deletions(-)
>>
>> diff --git a/src/systemadm.vala b/src/systemadm.vala
>> index 21177bf..9861ae4 100644
>> --- a/src/systemadm.vala
>> +++ b/src/systemadm.vala
>> @@ -442,6 +442,11 @@ public class MainWindow : Window {
>> }
>>
>> public string make_dependency_string(string? prefix, string word, string[] dependencies) {
>> + List<string> sorted = new List<string>();
>> + foreach (string i in dependencies)
>> + sorted.append(i);
>> + sorted.sort(strcmp);
>> +
>
> The above code have O(n^2) complexity (each append have O(n) and there
> is O(n) appends) and IIRC[1] list should start by NULL:
>
> List<string>? sorted = NULL;
> foreach (string i in dependencies)
> sorted.prepend(i);
> sorted.reverse();
> sorted.sort(strcmp);
>
> or even better if dependencies is List:
>
> List<unowned string>? sorted = dependencies.copy();
> sorted.sort(strcmp);
>
> [1] "There is no function to create a GList. NULL is considered to be
> the empty list so you simply set a GList* to NULL." from
> http://developer.gnome.org/glib/2.28/glib-Doubly-Linked-Lists.html
>
>
>> bool first = true;
>> string r;
>>
>> @@ -450,7 +455,7 @@ public class MainWindow : Window {
>> else
>> r = prefix;
>>
>> - foreach (string i in dependencies) {
>> + foreach (string i in sorted) {
>> if (r != "")
>> r += first ? "\n" : ",";
>>
>
> Regards
More information about the systemd-devel
mailing list