OSDN Git Service

introduce generics to KGram class
[stigmata/stigmata.git] / src / main / java / jp / naist / se / stigmata / RoundRobinComparisonResultSet.java
1 package jp.naist.se.stigmata;\r
2 \r
3 /*\r
4  * $Id$\r
5  */\r
6 \r
7 import java.net.URL;\r
8 import java.util.Arrays;\r
9 import java.util.HashMap;\r
10 import java.util.Iterator;\r
11 import java.util.List;\r
12 import java.util.Map;\r
13 \r
14 /**\r
15  * Concrete class for ComparisonResultSet. This instance compare class files by round robin.\r
16  *\r
17  * @author  Haruaki TAMADA\r
18  * @version  $Revision$ $Date$\r
19  */\r
20 public class RoundRobinComparisonResultSet implements ComparisonResultSet{\r
21     private List<BirthmarkSet> holders1;\r
22     private List<BirthmarkSet> holders2;\r
23     private BirthmarkEnvironment environment;\r
24 \r
25     private int compareCount;\r
26     private boolean tablePair = true;\r
27     private boolean samePair = false;\r
28 \r
29     /**\r
30      * constructor.  if user gives { a, b, c, } as holders1, then\r
31      * the instance (created by this constructor) compares { a<->b, a<->c,\r
32      * b<->c, }.\r
33      */\r
34     public RoundRobinComparisonResultSet(BirthmarkSet[] holders1, BirthmarkEnvironment environment){\r
35         this(holders1, environment, false);\r
36     }\r
37 \r
38     /**\r
39      * constructor.  if user gives { a, b, c, } as holders1, then the\r
40      * instance (created by this constructor when samePair is true)\r
41      * compares { a<->a, b<->a, b<->b, c<->a, c<->b, c<->c, }.\r
42      * Otherwise, the instance compares { a<->b, a<->c, b<->c, } when\r
43      * samePair is false.\r
44      */\r
45     public RoundRobinComparisonResultSet(BirthmarkSet[] holders1, BirthmarkEnvironment environment,\r
46                                           boolean samePair){\r
47         this.holders1 = Arrays.asList(holders1);\r
48         this.holders2 = Arrays.asList(holders1);\r
49         this.environment = environment;\r
50 \r
51         tablePair = false;\r
52         setCompareSamePair(samePair);\r
53     }\r
54 \r
55     /**\r
56      * constructor.  if user gives { a, b, c, } as holders1 and { x,\r
57      * y, z, } as holders2, then the instance compares { a<->x, a<->y,\r
58      * a<->z, b<->x, b<->y, b<->z, c<->x, c<->y, c<->z, }.\r
59      */\r
60     public RoundRobinComparisonResultSet(final BirthmarkSet[] holders1, final BirthmarkSet[] holders2,\r
61                                           BirthmarkEnvironment environment){\r
62         this.holders1 = Arrays.asList(holders1);\r
63         this.holders2 = Arrays.asList(holders2);\r
64         this.environment = environment;\r
65         tablePair = true;\r
66 \r
67         this.compareCount = holders1.length * holders2.length;\r
68     }\r
69 \r
70     /**\r
71      * @return  environment\r
72      */\r
73     public BirthmarkEnvironment getEnvironment(){\r
74         return environment;\r
75     }\r
76 \r
77     /**\r
78      * update same pair comparing flag unless two birthmark array is setted.\r
79      */\r
80     public void setCompareSamePair(boolean flag){\r
81         samePair = flag;\r
82         if(samePair){\r
83             compareCount = holders1.size() * (holders1.size() + 1) / 2;\r
84         }\r
85         else{\r
86             compareCount = holders1.size() * (holders1.size() - 1) / 2;\r
87         }\r
88     }\r
89 \r
90     public boolean isCompareSamePair(){\r
91         return samePair;\r
92     }\r
93 \r
94     /**\r
95      * returns the compare count of birthmark sets.\r
96      */\r
97     public int getComparisonCount(){\r
98         return compareCount;\r
99     }\r
100 \r
101     /**\r
102      * return a iterator of whole comparison.\r
103      */\r
104     public Iterator<ComparisonPair> iterator(){\r
105         return new ComparisonIterator();\r
106     }\r
107 \r
108     public BirthmarkSet[] getComparisonSources(){\r
109         Map<URL, BirthmarkSet> map = new HashMap<URL, BirthmarkSet>();\r
110         for(BirthmarkSet set: holders1){\r
111             map.put(set.getLocation(), set);\r
112         }\r
113         for(BirthmarkSet set: holders2){\r
114             map.put(set.getLocation(), set);\r
115         }\r
116 \r
117         BirthmarkSet[] entries = new BirthmarkSet[map.size()];\r
118         int index = 0;\r
119         for(Map.Entry<URL, BirthmarkSet> entry: map.entrySet()){\r
120             entries[index] = entry.getValue();\r
121             index++;\r
122         }\r
123 \r
124         return entries;\r
125     }\r
126 \r
127     /**\r
128      * iterator class.\r
129      */\r
130     private class ComparisonIterator implements Iterator<ComparisonPair>{\r
131         private int i = 0;\r
132         private int j = 0;\r
133         private int count = 0;\r
134 \r
135         public boolean hasNext(){\r
136             return count < getComparisonCount();\r
137         }\r
138 \r
139         public ComparisonPair next(){\r
140             if((tablePair  && i == holders1.size()) || \r
141                (!tablePair && !samePair && i == j) ||\r
142                (!tablePair && samePair && i > j)){\r
143                 i = 0;\r
144                 j++;\r
145             }\r
146             ComparisonPair pair = new ComparisonPair(holders1.get(i), holders2.get(j), environment);\r
147             count++;\r
148             i++;\r
149             return pair;\r
150         }\r
151 \r
152         public void remove(){\r
153         }\r
154     }\r
155 }\r