OSDN Git Service

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