*/\r
\r
import java.io.Serializable;\r
-import java.util.Arrays;\r
+import java.util.ArrayList;\r
+import java.util.LinkedHashSet;\r
+import java.util.List;\r
+import java.util.Set;\r
\r
/**\r
* \r
* @author Haruaki TAMADA\r
* @version $Revision$ $Date$\r
*/\r
-public class KGram implements Serializable{\r
+public class KGram<T> implements Serializable{\r
private static final long serialVersionUID = 273465874532523L;\r
- private int[] values;\r
+ private List<T> list = new ArrayList<T>();\r
+ private int maxLength = 4;\r
\r
public KGram(int kvalue){\r
- values = new int[kvalue];\r
+ setKValue(kvalue);\r
+ }\r
+\r
+ public void setKValue(int kvalue){\r
+ this.maxLength = kvalue;\r
+ }\r
+\r
+ public int getKValue(){\r
+ return maxLength;\r
}\r
\r
public String toString(){\r
StringBuffer buffer = new StringBuffer("{ ");\r
- for(int i = 0; i < values.length; i++){\r
+ for(int i = 0; i < maxLength; i++){\r
if(i != 0) buffer.append(", ");\r
- buffer.append(values[i]);\r
+ buffer.append(list.get(i));\r
}\r
buffer.append(" }");\r
return new String(buffer);\r
}\r
\r
- public void set(int index, int value){\r
- if(index < 0 || index >= values.length){\r
- throw new ArrayIndexOutOfBoundsException("expected 0-" + values.length + ": " + index);\r
+ public void set(int index, T value){\r
+ if(index < 0 || index >= maxLength){\r
+ throw new ArrayIndexOutOfBoundsException("expected 0-" + maxLength + ": " + index);\r
+ }\r
+ if(list.size() == index){\r
+ list.add(value);\r
+ }\r
+ else{\r
+ list.set(index, value);\r
}\r
- values[index] = value;\r
}\r
\r
- public int get(int index){\r
- if(index < 0 || index >= values.length){\r
- throw new ArrayIndexOutOfBoundsException("expected 0-" + values.length + ": " + index);\r
+ public T get(int index){\r
+ if(index < 0 || index >= maxLength){\r
+ throw new ArrayIndexOutOfBoundsException("expected 0-" + maxLength + ": " + index);\r
}\r
- return values[index];\r
+ return list.get(index);\r
}\r
\r
+ @SuppressWarnings("unchecked")\r
public boolean equals(Object o){\r
if(o instanceof KGram){\r
- return Arrays.equals(values, ((KGram)o).values);\r
+ KGram kgram = (KGram)o;\r
+ boolean flag = getKValue() == kgram.getKValue();\r
+ for(int i = 0; !flag && i < maxLength; i++){\r
+ if(!get(i).equals(kgram.get(i))){\r
+ flag = false;\r
+ }\r
+ }\r
+ return flag;\r
}\r
return false;\r
}\r
\r
public int hashCode(){\r
- return Arrays.hashCode(values);\r
+ return list.hashCode();\r
+ }\r
+\r
+ public static <T> KGram<T>[] buildKGram(T[] values, int kvalue){\r
+ Set<KGram<T>> kgrams = new LinkedHashSet<KGram<T>>();\r
+\r
+ if(values.length >= kvalue){\r
+ int max = values.length - (kvalue - 1);\r
+ for(int i = 0; i < max; i++){\r
+ KGram<T> kgram = new KGram<T>(kvalue);\r
+ for(int j = 0; j < kvalue; j++){\r
+ kgram.set(j, values[i + j]);\r
+ }\r
+ kgrams.add(kgram);\r
+ }\r
+ }\r
+ return kgrams.toArray(new KGram[kgrams.size()]);\r
}\r
}\r
}\r
\r
public void visitEnd(){\r
- Set<KGram> kgrams = new HashSet<KGram>();\r
+ Set<KGram<Integer>> kgrams = new HashSet<KGram<Integer>>();\r
if(opcodes.size() >= getKValue()){\r
int kvalue = getKValue();\r
int max = opcodes.size() - (kvalue - 1);\r
for(int i = 0; i < max; i++){\r
- KGram kgram = new KGram(kvalue);\r
+ KGram<Integer> kgram = new KGram<Integer>(kvalue);\r
for(int j = 0; j < kvalue; j++){\r
kgram.set(j, opcodes.get(i + j));\r
}\r
kgrams.add(kgram);\r
}\r
}\r
- for(KGram kgram: kgrams){\r
- addElement(new KGramBasedBirthmarkElement(kgram));\r
+ for(KGram<Integer> kgram: kgrams){\r
+ addElement(new KGramBasedBirthmarkElement<Integer>(kgram));\r
}\r
}\r
\r