OSDN Git Service

change kgram format
[stigmata/stigmata-plugins.git] / kgram / src / main / java / jp / sourceforge / stigmata / birthmarks / kgram / KGram.java
1 package jp.sourceforge.stigmata.birthmarks.kgram;
2
3 import java.io.Serializable;
4 import java.lang.reflect.Array;
5 import java.util.Arrays;
6
7 /**
8  * This class represents k-gram of the some sequence.
9  *
10  * @author Haruaki TAMADA
11  */
12 public class KGram<T> implements Serializable{
13     private static final long serialVersionUID = 273465874532523L;
14     // private List<T> list = new ArrayList<T>();
15     private int maxLength = 4;
16     private T[] values;
17
18     /**
19      * constructor.
20      * @param kvalue the number of elements of this object.
21      */
22     public KGram(int kvalue){
23         setKValue(kvalue);
24     }
25
26     /**
27      * sets k-value.
28      * @param kvalue the number of elements of this object.
29      */
30     public void setKValue(int kvalue){
31         this.maxLength = kvalue;
32     }
33
34     /**
35      * returns k-value which is the number of elements.
36      * @return the number of elements.
37      */
38     public int getKValue(){
39         return maxLength;
40     }
41
42     /**
43      * returns string representation of this object.
44      */
45     @Override
46     public String toString(){
47         StringBuffer buffer = new StringBuffer();
48         for(int i = 0; i < maxLength; i++){
49             if(i != 0) buffer.append(" ");
50             buffer.append(get(i));
51         }
52         return new String(buffer);
53     }
54
55     /**
56      * sets the given value to kgram element at given index.
57      * @param index index.
58      * @param value value.
59      */
60     @SuppressWarnings("unchecked")
61     public void set(int index, T value){
62         if(index < 0 || index >= maxLength){
63             throw new ArrayIndexOutOfBoundsException(
64                 "expected 0-" + (maxLength - 1) + ": " + index
65             );
66         }
67         if(value == null){
68             throw new NullPointerException("null value");
69         }
70         if(values == null){
71             values = (T[])Array.newInstance(value.getClass(), getKValue());
72         }
73         values[index] = value;
74     }
75
76     /**
77      * returns an object of given index.
78      */
79     public T get(int index){
80         T returnValue = null;
81         if(index < 0 || index >= maxLength){
82             throw new ArrayIndexOutOfBoundsException(
83                 "expected 0-" + (maxLength - 1) + ": " + index
84             );
85         }
86         if(values != null){
87             returnValue = values[index];
88         }
89
90         return returnValue;
91     }
92
93     /**
94      * adds value at last index.
95      *
96      * this object is called with given 2 when following situation,
97      * <ul>
98      *   <li>{ 1, 3, null, null } -&gt; { 1, 2, 3, null } and return 2<li>
99      *   <li>{ 1, null, 3, null } -&gt; { 1, 2, 3, null } and return 1<li>
100      *   <li>{ 1, 2, 3, 4 } -&gt; { 1, 2, 3, 4 } and return -1<li>
101      * </ul>
102      *
103      * @param value value for addition.
104      * @return added index.
105      */
106     public int add(T value){
107         int index = -1;
108         for(int i = 0; i < values.length; i++){
109             if(values[i] == null){
110                 index = i;
111                 values[i] = value;
112                 break;
113             }
114         }
115         return index;
116     }
117
118     /**
119      * returns an array of elements this object has.
120      * @return
121      */
122     @SuppressWarnings("unchecked")
123     public T[] toArray(){
124         if(values == null){
125             throw new IllegalStateException("this object has no elements.");
126         }
127         T[] newarray = (T[])Array.newInstance(
128             values[0].getClass(), getKValue()
129         );
130         System.arraycopy(values, 0, newarray, 0, getKValue());
131         return newarray;
132     }
133
134     @Override
135     public boolean equals(Object o){
136         if(o instanceof KGram){
137             KGram<?> kgram = (KGram<?>)o;
138             boolean flag = getKValue() == kgram.getKValue();
139             for(int i = 0; !flag && i < maxLength; i++){
140                 if(!get(i).equals(kgram.get(i))){
141                     flag = false;
142                     break;
143                 }
144             }
145             return flag;
146         }
147         return false;
148     }
149
150     @Override
151     public int hashCode(){
152         return Arrays.hashCode(values);
153     }
154 }