OSDN Git Service

introduce generics to KGram class
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Sun, 23 Sep 2007 01:40:38 +0000 (01:40 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Sun, 23 Sep 2007 01:40:38 +0000 (01:40 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@203 acee48c3-7b26-0410-bdac-b3d0e5314bbc

src/main/java/jp/naist/se/stigmata/birthmarks/kgram/KGram.java
src/main/java/jp/naist/se/stigmata/birthmarks/kgram/KGramBasedBirthmarkElement.java
src/main/java/jp/naist/se/stigmata/birthmarks/kgram/KGramBasedBirthmarkExtractVisitor.java

index 44a4dc3..7678838 100644 (file)
@@ -5,53 +5,94 @@ package jp.naist.se.stigmata.birthmarks.kgram;
  */\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
index 00a1ca3..539b02c 100644 (file)
@@ -11,12 +11,12 @@ import jp.naist.se.stigmata.BirthmarkElement;
  * @author Haruaki TAMADA\r
  * @version $Revision$ $Date$\r
  */\r
-public class KGramBasedBirthmarkElement extends BirthmarkElement{\r
+public class KGramBasedBirthmarkElement<T> extends BirthmarkElement{\r
     private static final long serialVersionUID = 28546543857543634L;\r
 \r
-    private KGram kgram;\r
+    private KGram<T> kgram;\r
 \r
-    public KGramBasedBirthmarkElement(KGram kgram){\r
+    public KGramBasedBirthmarkElement(KGram<T> kgram){\r
         super(kgram.toString());\r
         this.kgram = kgram;\r
     }\r
index e7219c2..cc57da8 100644 (file)
@@ -38,20 +38,20 @@ public class KGramBasedBirthmarkExtractVisitor extends BirthmarkExtractVisitor{
     }\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