source: DCWoRMS/trunk/src/simulator/utils/MergeSort.java @ 477

Revision 477, 4.9 KB checked in by wojtekp, 13 years ago (diff)
  • Property svn:mime-type set to text/plain
Line 
1package simulator.utils;
2
3import java.lang.reflect.InvocationTargetException;
4import java.lang.reflect.Method;
5import java.util.ArrayList;
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.Iterator;
9
10public class MergeSort<T>{
11
12        private Class<?> c;
13        private Method m;
14
15        public void initSort(T[] array, String methodName, boolean ascending) {
16                try {
17                        c = Class.forName(array.getClass().getCanonicalName().substring(0,  array.getClass().getCanonicalName().length() -2));
18                } catch (ClassNotFoundException e) {
19                        return;
20                }
21                try {
22                        m = c.getMethod(methodName);
23                } catch (SecurityException e) {
24                        return;
25                } catch (NoSuchMethodException e) {
26                        return;
27                }
28                T[] tmpArray = array.clone();
29                mergeSort(array, tmpArray, 0, array.length-1, ascending);
30        }
31       
32        public void initCollectionSort(Collection<T> collection, String methodName, boolean ascending) {
33               
34                Iterator<T> iterator = collection.iterator();
35                try {
36                        while (iterator.hasNext() && c == null) {
37                                c = Class.forName(iterator.next().getClass().getCanonicalName());
38                        }
39                } catch (ClassNotFoundException e) {
40                        return;
41                }
42                if(c == null)
43                        return;
44                try {
45                        m = c.getMethod(methodName);
46                } catch (SecurityException e) {
47                        return;
48                } catch (NoSuchMethodException e) {
49                        return;
50                }
51                T[] array = (T[]) collection.toArray();
52                T[] tmpArray = array.clone();
53                mergeSort(array, tmpArray, 0, array.length-1, ascending);
54                collection.clear();
55                collection.addAll(new ArrayList(Arrays.asList(array)));
56
57        }
58
59        private void mergeSort(T[] array, T[] tmpArray, int left,
60                        int right, boolean ascending) {
61                if (left < right) {
62                        int center = (left + right) / 2;
63                        mergeSort(array, tmpArray, left, center, ascending);
64                        mergeSort(array, tmpArray, center + 1, right, ascending);
65                        merge(array, tmpArray, left, center + 1, right, ascending);
66                }
67        }
68
69        private void merge(T[] array, T[] tmpArray, int leftPos,
70                        int rightPos, int rightEnd, boolean ascending) {
71                int leftEnd = rightPos - 1;
72                int tmpPos = leftPos;
73                int numElements = rightEnd - leftPos + 1;
74                while (leftPos <= leftEnd && rightPos <= rightEnd)
75                        try {
76                                if(ascending)
77                                {       
78                                        if (Integer.class.isInstance(m.invoke(array[leftPos])))
79                                        {
80                                                if ((Integer) m.invoke(array[leftPos]) < (Integer) m.invoke(array[rightPos]))
81                                                        tmpArray[tmpPos++] = array[leftPos++];
82                                                else
83                                                        tmpArray[tmpPos++] = array[rightPos++];
84                                        }
85                                        else if (Long.class.isInstance(m.invoke(array[leftPos])))
86                                        {
87                                                if ((Long) m.invoke(array[leftPos]) < (Long) m.invoke(array[rightPos]))
88                                                        tmpArray[tmpPos++] = array[leftPos++];
89                                                else
90                                                        tmpArray[tmpPos++] = array[rightPos++];
91                                        }
92                                        else if (Double.class.isInstance(m.invoke(array[leftPos])))
93                                        {
94                                                if ((Double) m.invoke(array[leftPos]) < (Double) m.invoke(array[rightPos]))
95                                                        tmpArray[tmpPos++] = array[leftPos++];
96                                                else
97                                                        tmpArray[tmpPos++] = array[rightPos++];
98                                        }
99                                        else if (String.class.isInstance(m.invoke(array[leftPos])))
100                                        {
101                                                if (((String) m.invoke(array[leftPos])).compareTo((String) m.invoke(array[rightPos])) < 0)
102                                                        tmpArray[tmpPos++] = array[leftPos++];
103                                                else
104                                                        tmpArray[tmpPos++] = array[rightPos++];
105                                        } else {
106                                                throw new IllegalAccessException();
107                                        }
108                                }
109                               
110                                else {
111                                        if (Integer.class.isInstance(m.invoke(array[leftPos])))
112                                        {
113                                                if ((Integer) m.invoke(array[leftPos]) > (Integer) m.invoke(array[rightPos]))
114                                                        tmpArray[tmpPos++] = array[leftPos++];
115                                                else
116                                                        tmpArray[tmpPos++] = array[rightPos++];
117                                        }
118                                        else if (Long.class.isInstance(m.invoke(array[leftPos])))
119                                        {
120                                                if ((Long) m.invoke(array[leftPos]) > (Long) m.invoke(array[rightPos]))
121                                                        tmpArray[tmpPos++] = array[leftPos++];
122                                                else
123                                                        tmpArray[tmpPos++] = array[rightPos++];
124                                        }
125                                        else if (Double.class.isInstance(m.invoke(array[leftPos])))
126                                        {
127                                                if ((Double) m.invoke(array[leftPos]) > (Double) m.invoke(array[rightPos]))
128                                                        tmpArray[tmpPos++] = array[leftPos++];
129                                                else
130                                                        tmpArray[tmpPos++] = array[rightPos++];
131                                        }
132                                        else if (String.class.isInstance(m.invoke(array[leftPos])))
133                                        {
134                                                if (((String) m.invoke(array[leftPos])).compareTo((String) m.invoke(array[rightPos])) > 0)
135                                                        tmpArray[tmpPos++] = array[leftPos++];
136                                                else
137                                                        tmpArray[tmpPos++] = array[rightPos++];
138                                        } else {
139                                                throw new IllegalAccessException();
140                                        }
141                                }
142                        } catch (IllegalArgumentException e) {
143                                break;
144                        } catch (IllegalAccessException e) {
145                                break;
146                        } catch (InvocationTargetException e) {
147                                break;
148                        }
149
150                while (leftPos <= leftEnd)
151                        tmpArray[tmpPos++] = array[leftPos++];
152
153                while (rightPos <= rightEnd)
154                        tmpArray[tmpPos++] = array[rightPos++];
155
156                for (int i = 0; i < numElements; i++, rightEnd--)
157                        array[rightEnd] = tmpArray[rightEnd];
158        }
159}
Note: See TracBrowser for help on using the repository browser.