Normand Briere
2018-07-07 09ddd38fd4a8a7100c834a5e976f4796fae53541
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package timeflow.data.db;
 
import java.util.*;
 
import timeflow.data.time.RoughTime;
 
public abstract class ActComparator implements Comparator<Act> {
   
   protected Field field;
   protected boolean ascending=true;
   protected String description;
   
   
   private ActComparator(Field field, String description)
   {
       this.field=field;
       this.description=description;
   }
   
   public String getDescription()
   {
       return description + (ascending ? "" : " (descending)");
   }
   
   public static ActComparator by(Field field)
   {
       Class type=field.getType();
       if (type==Double.class)
           return new NumberComparator(field);
       if (type==String[].class)
           return new ArrayComparator(field);
       if (type==RoughTime.class)
           return new TimeComparator(field);
       return new StringComparator(field);
   }
   
   static class TimeComparator extends ActComparator
   {
       
       TimeComparator(Field field)
       {
           super(field, "by time");
       }
 
       @Override
       public int compare(Act o1, Act o2) {
           RoughTime a1=o1.getTime(field);
           RoughTime a2=o2.getTime(field);
           if (a1==a2)
               return 0;
           if (a1==null)
               return ascending ? 1 : -1;
           if (a2==null)
               return ascending ? -1 : 1;
           int n=a1.compareTo(a2);
           return ascending ? n : -n;
       }
   }
 
   
   static class ArrayComparator extends ActComparator
   {
       
       ArrayComparator(Field field)
       {
           super(field, "by length of "+field.getName());
       }
 
       @Override
       public int compare(Act o1, Act o2) {
           int n=length(o1.getTextList(field))-length(o2.getTextList(field));
           return ascending ? n : -n;
       }
       
       static int length(String[] s)
       {
           return s==null ? 0 : s.length;
       }
   }
   
   static class StringComparator extends ActComparator
   {
       
       StringComparator(Field field)
       {
           super(field, "by "+field.getName());
       }
 
       @Override
       public int compare(Act o1, Act o2) {
           int n=val(o1.getString(field)).toString().compareTo(val(o2.getString(field)).toString());
           return ascending ? n : -n;
       }
       
       String val(String s)
       {
           return s==null ? "" : s;
       }
   }
   
   static class NumberComparator extends ActComparator
   {
       
       NumberComparator(Field field)
       {
           super(field, "by "+field.getName());
       }
 
       @Override
       public int compare(Act o1, Act o2) {
           double x=o1.getValue(field)-o2.getValue(field);
           int n=x>0 ? 1 : x<0 ? -1 : 0;
           return ascending ? n : -n;
       }
       
       
   }
}