テキストの各行をキーと値に分離し、複数テキストファイルを読み込み、キーを突き合わせ照合し、その結果を表示するGUIユーテリティです。
修訂 | 3076618e05fd204dca618d8825119e5a18a24cc8 (tree) |
---|---|
時間 | 2011-10-19 03:07:12 |
作者 | seraphy <seraphy@192....> |
Commiter | seraphy |
・フィルタ仕掛かり中
@@ -0,0 +1,116 @@ | ||
1 | +/* | |
2 | + * To change this template, choose Tools | Templates | |
3 | + * and open the template in the editor. | |
4 | + */ | |
5 | +package textkeymatcher.entity; | |
6 | + | |
7 | +/** | |
8 | + * カラムの関係で行の表示・非表示を決定する.<br> | |
9 | + * | |
10 | + * @author seraphy | |
11 | + */ | |
12 | +public enum DisplayMode implements RowFilter { | |
13 | + | |
14 | + /** | |
15 | + * すべて表示.<br> | |
16 | + */ | |
17 | + ALL() { | |
18 | + @Override | |
19 | + public boolean isAcceptable(RowValues values) { | |
20 | + // フィルタなし | |
21 | + return true; | |
22 | + } | |
23 | + }, | |
24 | + /** | |
25 | + * すべてのカラムに値があるもののみ表示.<br> | |
26 | + */ | |
27 | + MATCHED() { | |
28 | + @Override | |
29 | + public boolean isAcceptable(RowValues values) { | |
30 | + if (values == null) { | |
31 | + throw new IllegalArgumentException(); | |
32 | + } | |
33 | + int mx = values.getDataWidth(); | |
34 | + int validColumns = 0; | |
35 | + for (int idx = 0; idx < mx; idx++) { | |
36 | + int cnt = values.getCount(idx); | |
37 | + if (cnt > 0) { | |
38 | + // 1件以上のデータがあるカラムをカウントする. | |
39 | + validColumns++; | |
40 | + } | |
41 | + } | |
42 | + // すべてのカラムにデータがあればアクセプト | |
43 | + return mx == validColumns; | |
44 | + } | |
45 | + }, | |
46 | + /** | |
47 | + * いずれかのカラムに値がないもののみを表示.<br> | |
48 | + */ | |
49 | + UNMATCHED() { | |
50 | + @Override | |
51 | + public boolean isAcceptable(RowValues values) { | |
52 | + if (values == null) { | |
53 | + throw new IllegalArgumentException(); | |
54 | + } | |
55 | + int mx = values.getDataWidth(); | |
56 | + int validColumns = 0; | |
57 | + for (int idx = 0; idx < mx; idx++) { | |
58 | + int cnt = values.getCount(idx); | |
59 | + if (cnt > 0) { | |
60 | + // 1件以上のデータがあるカラムをカウントする. | |
61 | + validColumns++; | |
62 | + } | |
63 | + } | |
64 | + // いずれかのカラムにデータがなければアクセプト | |
65 | + return mx != validColumns; | |
66 | + } | |
67 | + }, | |
68 | + /** | |
69 | + * 最初のカラムに値があるもののみ表示.<br> | |
70 | + */ | |
71 | + EXISTS_FIRST_COLUMN() { | |
72 | + @Override | |
73 | + public boolean isAcceptable(RowValues values) { | |
74 | + if (values == null) { | |
75 | + throw new IllegalArgumentException(); | |
76 | + } | |
77 | + int mx = values.getDataWidth(); | |
78 | + if (mx > 0) { | |
79 | + int cnt = values.getCount(0); | |
80 | + if (cnt > 0) { | |
81 | + return true; | |
82 | + } | |
83 | + } | |
84 | + return false; | |
85 | + } | |
86 | + }, | |
87 | + /** | |
88 | + * 最初のカラムに値がないもののみ表示.<br> | |
89 | + */ | |
90 | + MISSING_FIRST_COLUMN() { | |
91 | + @Override | |
92 | + public boolean isAcceptable(RowValues values) { | |
93 | + if (values == null) { | |
94 | + throw new IllegalArgumentException(); | |
95 | + } | |
96 | + int mx = values.getDataWidth(); | |
97 | + if (mx > 0) { | |
98 | + int cnt = values.getCount(0); | |
99 | + if (cnt == 0) { | |
100 | + return true; | |
101 | + } | |
102 | + } | |
103 | + return true; | |
104 | + } | |
105 | + }, | |
106 | + ; | |
107 | + | |
108 | + /** | |
109 | + * 行ごとのカラムデータを指定し、カラムの関係から、その行を表示するか否かを判定する.<br> | |
110 | + * @param values 行ごとのカラムデータ | |
111 | + * @return 行が受け入れ可能であればtrue | |
112 | + */ | |
113 | + @Override | |
114 | + public abstract boolean isAcceptable(RowValues values); | |
115 | + | |
116 | +} |
@@ -0,0 +1,47 @@ | ||
1 | +/* | |
2 | + * To change this template, choose Tools | Templates | |
3 | + * and open the template in the editor. | |
4 | + */ | |
5 | +package textkeymatcher.entity; | |
6 | + | |
7 | +import java.util.AbstractMap; | |
8 | +import java.util.AbstractSet; | |
9 | +import java.util.Iterator; | |
10 | +import java.util.Map; | |
11 | +import java.util.Map.Entry; | |
12 | +import java.util.Set; | |
13 | + | |
14 | +/** | |
15 | + * | |
16 | + * @author seraphy | |
17 | + */ | |
18 | +public class FilteredRowMap extends AbstractMap<RowKey, RowValues> { | |
19 | + | |
20 | + private Map<RowKey, RowValues> dataMap; | |
21 | + | |
22 | + private RowFilter rowFilter = DisplayMode.ALL; | |
23 | + | |
24 | + public FilteredRowMap(Map<RowKey, RowValues> dataMap) { | |
25 | + if (dataMap == null) { | |
26 | + throw new IllegalArgumentException(); | |
27 | + } | |
28 | + this.dataMap = dataMap; | |
29 | + } | |
30 | + | |
31 | + public void setRowFilter(RowFilter rowFilter) { | |
32 | + if (rowFilter == null) { | |
33 | + throw new IllegalArgumentException(); | |
34 | + } | |
35 | + this.rowFilter = rowFilter; | |
36 | + } | |
37 | + | |
38 | + public RowFilter getRowFilter() { | |
39 | + return rowFilter; | |
40 | + } | |
41 | + | |
42 | + | |
43 | + @Override | |
44 | + public Set<Entry<RowKey, RowValues>> entrySet() { | |
45 | + return dataMap.entrySet(); | |
46 | + } | |
47 | +} |
@@ -7,13 +7,10 @@ package textkeymatcher.entity; | ||
7 | 7 | import java.util.AbstractMap; |
8 | 8 | import java.util.ArrayList; |
9 | 9 | import java.util.Collections; |
10 | -import java.util.List; | |
11 | 10 | import java.util.Map; |
12 | 11 | import java.util.Map.Entry; |
13 | 12 | import java.util.Set; |
14 | 13 | import java.util.TreeMap; |
15 | -import textkeymatcher.entity.KeyMatchedRowMap.RowKey; | |
16 | -import textkeymatcher.entity.KeyMatchedRowMap.RowValues; | |
17 | 14 | |
18 | 15 | /** |
19 | 16 | * 各カラムデータと、キーによるマッチングを行い、キーと値リストの組にする.<br> |
@@ -28,209 +25,6 @@ public class KeyMatchedRowMap extends AbstractMap<RowKey, RowValues> { | ||
28 | 25 | |
29 | 26 | |
30 | 27 | /** |
31 | - * 行のキー表現 | |
32 | - */ | |
33 | - public static class RowKey implements Comparable<RowKey> { | |
34 | - | |
35 | - /** | |
36 | - * キー判定方法 | |
37 | - */ | |
38 | - private final KeyMatcher keyMatcher; | |
39 | - | |
40 | - /** | |
41 | - * キーの生データ | |
42 | - */ | |
43 | - private final String key; | |
44 | - | |
45 | - | |
46 | - public RowKey(KeyMatcher keyMatcher, String key) { | |
47 | - if (keyMatcher == null) { | |
48 | - throw new IllegalArgumentException(); | |
49 | - } | |
50 | - | |
51 | - this.keyMatcher = keyMatcher; | |
52 | - this.key = key; | |
53 | - } | |
54 | - | |
55 | - public String getKey() { | |
56 | - return key; | |
57 | - } | |
58 | - | |
59 | - @Override | |
60 | - public int compareTo(RowKey t) { | |
61 | - String okey = t.key; | |
62 | - return keyMatcher.compare(key, okey); | |
63 | - } | |
64 | - | |
65 | - @Override | |
66 | - public int hashCode() { | |
67 | - return keyMatcher.hashCode(key); | |
68 | - } | |
69 | - | |
70 | - @Override | |
71 | - public boolean equals(Object obj) { | |
72 | - if (obj == this) { | |
73 | - return true; | |
74 | - } | |
75 | - if (obj != null && obj instanceof RowKey) { | |
76 | - RowKey rk = (RowKey) obj; | |
77 | - if (rk.keyMatcher != keyMatcher) { | |
78 | - return false; | |
79 | - } | |
80 | - return keyMatcher.compare(key, rk.key) == 0; | |
81 | - } | |
82 | - return false; | |
83 | - } | |
84 | - | |
85 | - /** | |
86 | - * キーのマッチング法に従った文字列表現 | |
87 | - * @return 文字列表現 | |
88 | - */ | |
89 | - @Override | |
90 | - public String toString() { | |
91 | - return keyMatcher.getNormalize(key); | |
92 | - } | |
93 | - } | |
94 | - | |
95 | - | |
96 | - /** | |
97 | - * データソースごとの値のリスト.<br> | |
98 | - */ | |
99 | - public static class RowValues { | |
100 | - | |
101 | - /** | |
102 | - * データソースごとのデータを入れる配列.<br> | |
103 | - * データソースごとに添字を指定する.<br> | |
104 | - * 単一データであれば文字列が入り、複数データであれば文字列のリストオブジェクトが入る.<br> | |
105 | - * 該当がなければ、nullとなる.<br> | |
106 | - */ | |
107 | - private Object[] datas; | |
108 | - | |
109 | - /** | |
110 | - * データソース数を指定して構築する. | |
111 | - * @param dataWidth データソース数 | |
112 | - */ | |
113 | - public RowValues(int dataWidth) { | |
114 | - this.datas = new Object[dataWidth]; | |
115 | - } | |
116 | - | |
117 | - /** | |
118 | - * データソース数を取得する | |
119 | - * @return データソース数 | |
120 | - */ | |
121 | - public int getDataWidth() { | |
122 | - return datas.length; | |
123 | - } | |
124 | - | |
125 | - /** | |
126 | - * データソースと、値を指定してデータをセットする.<br> | |
127 | - * 同じデータソースですでにデータがある場合はリストとして追加される.<br> | |
128 | - * @param column データソース添字 | |
129 | - * @param value データ、nullは空文字として登録される | |
130 | - */ | |
131 | - public void add(int column, String value) { | |
132 | - if (value == null) { | |
133 | - value = ""; | |
134 | - } | |
135 | - if (datas[column] == null) { | |
136 | - // 新規の場合 | |
137 | - datas[column] = value; | |
138 | - | |
139 | - } else if (datas[column] instanceof List) { | |
140 | - // すでに2要素以上ある場合 | |
141 | - @SuppressWarnings("unchecked") | |
142 | - List<String> lst = (List<String>) datas[column]; | |
143 | - lst.add(value); | |
144 | - | |
145 | - } else { | |
146 | - // すでに存在する場合はリストにつめ直す. | |
147 | - assert datas[column] instanceof String; | |
148 | - List<String> tmp = new ArrayList<String>(); | |
149 | - tmp.add((String) datas[column]); | |
150 | - tmp.add(value); | |
151 | - datas[column] = tmp; | |
152 | - } | |
153 | - } | |
154 | - | |
155 | - /** | |
156 | - * 各データソースの中の最大のデータ数.<br> | |
157 | - * すべてのデータソースにひとつもデータがなければ0となる.<br> | |
158 | - * @return 最大のデータ数 | |
159 | - */ | |
160 | - public int getMaxCount() { | |
161 | - int mx = 0; | |
162 | - int dataWidth = datas.length; | |
163 | - for (int dataIndex = 0; dataIndex < dataWidth; dataIndex++) { | |
164 | - int count = getCount(dataIndex); | |
165 | - if (count > mx) { | |
166 | - mx = count; | |
167 | - } | |
168 | - } | |
169 | - return mx; | |
170 | - } | |
171 | - | |
172 | - /** | |
173 | - * 指定したデータソースのデータの個数を返す. | |
174 | - * @param column 添字 | |
175 | - * @return データの個数、未登録ならば0 | |
176 | - */ | |
177 | - public int getCount(int column) { | |
178 | - if (column < 0 || column >= datas.length) { | |
179 | - // 範囲外、データがないので0を返す. | |
180 | - return 0; | |
181 | - } | |
182 | - Object data = datas[column]; | |
183 | - if (data != null && data instanceof List) { | |
184 | - // リスト格納であれば、要素数を返す | |
185 | - @SuppressWarnings("unchecked") | |
186 | - List<String> lst = (List<String>) datas[column]; | |
187 | - return lst.size(); | |
188 | - } | |
189 | - // 非nullで、リストでなければ単一要素なので1を返す | |
190 | - if (data != null) { | |
191 | - return 1; | |
192 | - } | |
193 | - // nullであればデータは未設定なので0 | |
194 | - return 0; | |
195 | - } | |
196 | - | |
197 | - /** | |
198 | - * 指定したデータソースの指定した番号のデータを取り出す.<br> | |
199 | - * 範囲外、もしくはデータ未登録である場合は空文字が返される.<br> | |
200 | - * @param column データソース番号 | |
201 | - * @param rowIndex データのインデックス、getCountで得られる個数分 | |
202 | - * @return データ、無し、もしくは範囲外の場合は空文字 | |
203 | - */ | |
204 | - public String get(int column, int rowIndex) { | |
205 | - if (column < 0 || column >= datas.length) { | |
206 | - return ""; | |
207 | - } | |
208 | - Object data = datas[column]; | |
209 | - if (data == null) { | |
210 | - return ""; | |
211 | - } | |
212 | - if (data instanceof List) { | |
213 | - @SuppressWarnings("unchecked") | |
214 | - List<String> lst = ((List<String>) data); | |
215 | - if (rowIndex >= 0 && rowIndex < lst.size()) { | |
216 | - // 複数データならば存在する行分だけ | |
217 | - return lst.get(rowIndex); | |
218 | - } | |
219 | - // 範囲外であればデータなし | |
220 | - return ""; | |
221 | - } | |
222 | - if (rowIndex == 0) { | |
223 | - // 単一データは先頭行のみ | |
224 | - return (String) data; | |
225 | - } | |
226 | - // 単一データで次行以降はデータなし。 | |
227 | - return ""; | |
228 | - } | |
229 | - | |
230 | - } | |
231 | - | |
232 | - | |
233 | - /** | |
234 | 28 | * キーの判定方法を示すキーマッチャ |
235 | 29 | */ |
236 | 30 | private KeyMatcher keyMatcher = KeyMatcher.TEXT; |
@@ -9,8 +9,6 @@ import java.util.Collections; | ||
9 | 9 | import java.util.List; |
10 | 10 | import java.util.Map; |
11 | 11 | import javax.swing.table.AbstractTableModel; |
12 | -import textkeymatcher.entity.KeyMatchedRowMap.RowKey; | |
13 | -import textkeymatcher.entity.KeyMatchedRowMap.RowValues; | |
14 | 12 | |
15 | 13 | /** |
16 | 14 | * データソースをキーと値に分解し、キーごとに集約されたデータマップから、 |
@@ -76,11 +74,13 @@ public class KeyMatchedRowView extends AbstractTableModel { | ||
76 | 74 | /** |
77 | 75 | * 行データのリスト.<br> |
78 | 76 | * 各要素に列データへのアクセス方法が格納されている.<br> |
77 | + * {@link #renumbering(java.util.Map) }したときに設定される.<br> | |
79 | 78 | */ |
80 | 79 | private List<RowNumMap> rowNumMaps = Collections.emptyList(); |
81 | 80 | |
82 | 81 | /** |
83 | - * 列数 | |
82 | + * 列数.<br> | |
83 | + * {@link #renumbering(java.util.Map) }したときに設定される.<br> | |
84 | 84 | */ |
85 | 85 | private int numOfColumns; |
86 | 86 |
@@ -0,0 +1,21 @@ | ||
1 | +/* | |
2 | + * To change this template, choose Tools | Templates | |
3 | + * and open the template in the editor. | |
4 | + */ | |
5 | +package textkeymatcher.entity; | |
6 | + | |
7 | +/** | |
8 | + * 行ごとのカラムデータを指定し、カラムの関係から、その行を表示するか否かを判定する.<br> | |
9 | + * | |
10 | + * @author seraphy | |
11 | + */ | |
12 | +public interface RowFilter { | |
13 | + | |
14 | + /** | |
15 | + * 行ごとのカラムデータを指定し、カラムの関係から、その行を表示するか否かを判定する.<br> | |
16 | + * @param values 行ごとのカラムデータ | |
17 | + * @return 行が受け入れ可能であればtrue | |
18 | + */ | |
19 | + boolean isAcceptable(RowValues values); | |
20 | + | |
21 | +} |
@@ -0,0 +1,71 @@ | ||
1 | +/* | |
2 | + * To change this template, choose Tools | Templates | |
3 | + * and open the template in the editor. | |
4 | + */ | |
5 | +package textkeymatcher.entity; | |
6 | + | |
7 | +/** | |
8 | + * 行のキー表現.<br> | |
9 | + * | |
10 | + * @author seraphy | |
11 | + */ | |
12 | +public class RowKey implements Comparable<RowKey> { | |
13 | + | |
14 | + /** | |
15 | + * キー判定方法 | |
16 | + */ | |
17 | + private final KeyMatcher keyMatcher; | |
18 | + | |
19 | + /** | |
20 | + * キーの生データ | |
21 | + */ | |
22 | + private final String key; | |
23 | + | |
24 | + public RowKey(KeyMatcher keyMatcher, String key) { | |
25 | + if (keyMatcher == null) { | |
26 | + throw new IllegalArgumentException(); | |
27 | + } | |
28 | + this.keyMatcher = keyMatcher; | |
29 | + this.key = key; | |
30 | + } | |
31 | + | |
32 | + public String getKey() { | |
33 | + return key; | |
34 | + } | |
35 | + | |
36 | + @Override | |
37 | + public int compareTo(RowKey t) { | |
38 | + String okey = t.key; | |
39 | + return keyMatcher.compare(key, okey); | |
40 | + } | |
41 | + | |
42 | + @Override | |
43 | + public int hashCode() { | |
44 | + return keyMatcher.hashCode(key); | |
45 | + } | |
46 | + | |
47 | + @Override | |
48 | + public boolean equals(Object obj) { | |
49 | + if (obj == this) { | |
50 | + return true; | |
51 | + } | |
52 | + if (obj != null && obj instanceof RowKey) { | |
53 | + RowKey rk = (RowKey) obj; | |
54 | + if (rk.keyMatcher != keyMatcher) { | |
55 | + return false; | |
56 | + } | |
57 | + return keyMatcher.compare(key, rk.key) == 0; | |
58 | + } | |
59 | + return false; | |
60 | + } | |
61 | + | |
62 | + /** | |
63 | + * キーのマッチング法に従った文字列表現 | |
64 | + * @return 文字列表現 | |
65 | + */ | |
66 | + @Override | |
67 | + public String toString() { | |
68 | + return keyMatcher.getNormalize(key); | |
69 | + } | |
70 | + | |
71 | +} |
@@ -0,0 +1,144 @@ | ||
1 | +/* | |
2 | + * To change this template, choose Tools | Templates | |
3 | + * and open the template in the editor. | |
4 | + */ | |
5 | +package textkeymatcher.entity; | |
6 | + | |
7 | +import java.util.ArrayList; | |
8 | +import java.util.List; | |
9 | + | |
10 | +/** | |
11 | + * データソースごとの値のリスト.<br> | |
12 | + * | |
13 | + * @author seraphy | |
14 | + */ | |
15 | +public class RowValues { | |
16 | + | |
17 | + /** | |
18 | + * データソースごとのデータを入れる配列.<br> | |
19 | + * データソースごとに添字を指定する.<br> | |
20 | + * 単一データであれば文字列が入り、複数データであれば文字列のリストオブジェクトが入る.<br> | |
21 | + * 該当がなければ、nullとなる.<br> | |
22 | + */ | |
23 | + private Object[] datas; | |
24 | + | |
25 | + /** | |
26 | + * データソース数を指定して構築する. | |
27 | + * @param dataWidth データソース数 | |
28 | + */ | |
29 | + public RowValues(int dataWidth) { | |
30 | + this.datas = new Object[dataWidth]; | |
31 | + } | |
32 | + | |
33 | + /** | |
34 | + * データソース数を取得する | |
35 | + * @return データソース数 | |
36 | + */ | |
37 | + public int getDataWidth() { | |
38 | + return datas.length; | |
39 | + } | |
40 | + | |
41 | + /** | |
42 | + * データソースと、値を指定してデータをセットする.<br> | |
43 | + * 同じデータソースですでにデータがある場合はリストとして追加される.<br> | |
44 | + * @param column データソース添字 | |
45 | + * @param value データ、nullは空文字として登録される | |
46 | + */ | |
47 | + public void add(int column, String value) { | |
48 | + if (value == null) { | |
49 | + value = ""; | |
50 | + } | |
51 | + if (datas[column] == null) { | |
52 | + // 新規の場合 | |
53 | + datas[column] = value; | |
54 | + } else if (datas[column] instanceof List) { | |
55 | + // すでに2要素以上ある場合 | |
56 | + @SuppressWarnings(value = "unchecked") | |
57 | + List<String> lst = (List<String>) datas[column]; | |
58 | + lst.add(value); | |
59 | + } else { | |
60 | + // すでに存在する場合はリストにつめ直す. | |
61 | + assert datas[column] instanceof String; | |
62 | + List<String> tmp = new ArrayList<String>(); | |
63 | + tmp.add((String) datas[column]); | |
64 | + tmp.add(value); | |
65 | + datas[column] = tmp; | |
66 | + } | |
67 | + } | |
68 | + | |
69 | + /** | |
70 | + * 各データソースの中の最大のデータ数.<br> | |
71 | + * すべてのデータソースにひとつもデータがなければ0となる.<br> | |
72 | + * @return 最大のデータ数 | |
73 | + */ | |
74 | + public int getMaxCount() { | |
75 | + int mx = 0; | |
76 | + int dataWidth = datas.length; | |
77 | + for (int dataIndex = 0; dataIndex < dataWidth; dataIndex++) { | |
78 | + int count = getCount(dataIndex); | |
79 | + if (count > mx) { | |
80 | + mx = count; | |
81 | + } | |
82 | + } | |
83 | + return mx; | |
84 | + } | |
85 | + | |
86 | + /** | |
87 | + * 指定したデータソースのデータの個数を返す. | |
88 | + * @param column 添字 | |
89 | + * @return データの個数、未登録ならば0 | |
90 | + */ | |
91 | + public int getCount(int column) { | |
92 | + if (column < 0 || column >= datas.length) { | |
93 | + // 範囲外、データがないので0を返す. | |
94 | + return 0; | |
95 | + } | |
96 | + Object data = datas[column]; | |
97 | + if (data != null && data instanceof List) { | |
98 | + // リスト格納であれば、要素数を返す | |
99 | + @SuppressWarnings(value = "unchecked") | |
100 | + List<String> lst = (List<String>) datas[column]; | |
101 | + return lst.size(); | |
102 | + } | |
103 | + // 非nullで、リストでなければ単一要素なので1を返す | |
104 | + if (data != null) { | |
105 | + return 1; | |
106 | + } | |
107 | + // nullであればデータは未設定なので0 | |
108 | + return 0; | |
109 | + } | |
110 | + | |
111 | + /** | |
112 | + * 指定したデータソースの指定した番号のデータを取り出す.<br> | |
113 | + * 範囲外、もしくはデータ未登録である場合は空文字が返される.<br> | |
114 | + * @param column データソース番号 | |
115 | + * @param rowIndex データのインデックス、getCountで得られる個数分 | |
116 | + * @return データ、無し、もしくは範囲外の場合は空文字 | |
117 | + */ | |
118 | + public String get(int column, int rowIndex) { | |
119 | + if (column < 0 || column >= datas.length) { | |
120 | + return ""; | |
121 | + } | |
122 | + Object data = datas[column]; | |
123 | + if (data == null) { | |
124 | + return ""; | |
125 | + } | |
126 | + if (data instanceof List) { | |
127 | + @SuppressWarnings(value = "unchecked") | |
128 | + List<String> lst = (List<String>) data; | |
129 | + if (rowIndex >= 0 && rowIndex < lst.size()) { | |
130 | + // 複数データならば存在する行分だけ | |
131 | + return lst.get(rowIndex); | |
132 | + } | |
133 | + // 範囲外であればデータなし | |
134 | + return ""; | |
135 | + } | |
136 | + if (rowIndex == 0) { | |
137 | + // 単一データは先頭行のみ | |
138 | + return (String) data; | |
139 | + } | |
140 | + // 単一データで次行以降はデータなし。 | |
141 | + return ""; | |
142 | + } | |
143 | + | |
144 | +} |