• R/O
  • HTTP
  • SSH
  • HTTPS

提交

標籤

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

テキストの各行をキーと値に分離し、複数テキストファイルを読み込み、キーを突き合わせ照合し、その結果を表示するGUIユーテリティです。


Commit MetaInfo

修訂3076618e05fd204dca618d8825119e5a18a24cc8 (tree)
時間2011-10-19 03:07:12
作者seraphy <seraphy@192....>
Commiterseraphy

Log Message

・フィルタ仕掛かり中

Change Summary

差異

--- /dev/null
+++ b/src/textkeymatcher/entity/DisplayMode.java
@@ -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+}
--- /dev/null
+++ b/src/textkeymatcher/entity/FilteredRowMap.java
@@ -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+}
--- a/src/textkeymatcher/entity/KeyMatchedRowMap.java
+++ b/src/textkeymatcher/entity/KeyMatchedRowMap.java
@@ -7,13 +7,10 @@ package textkeymatcher.entity;
77 import java.util.AbstractMap;
88 import java.util.ArrayList;
99 import java.util.Collections;
10-import java.util.List;
1110 import java.util.Map;
1211 import java.util.Map.Entry;
1312 import java.util.Set;
1413 import java.util.TreeMap;
15-import textkeymatcher.entity.KeyMatchedRowMap.RowKey;
16-import textkeymatcher.entity.KeyMatchedRowMap.RowValues;
1714
1815 /**
1916 * 各カラムデータと、キーによるマッチングを行い、キーと値リストの組にする.<br>
@@ -28,209 +25,6 @@ public class KeyMatchedRowMap extends AbstractMap<RowKey, RowValues> {
2825
2926
3027 /**
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- /**
23428 * キーの判定方法を示すキーマッチャ
23529 */
23630 private KeyMatcher keyMatcher = KeyMatcher.TEXT;
--- a/src/textkeymatcher/entity/KeyMatchedRowView.java
+++ b/src/textkeymatcher/entity/KeyMatchedRowView.java
@@ -9,8 +9,6 @@ import java.util.Collections;
99 import java.util.List;
1010 import java.util.Map;
1111 import javax.swing.table.AbstractTableModel;
12-import textkeymatcher.entity.KeyMatchedRowMap.RowKey;
13-import textkeymatcher.entity.KeyMatchedRowMap.RowValues;
1412
1513 /**
1614 * データソースをキーと値に分解し、キーごとに集約されたデータマップから、
@@ -76,11 +74,13 @@ public class KeyMatchedRowView extends AbstractTableModel {
7674 /**
7775 * 行データのリスト.<br>
7876 * 各要素に列データへのアクセス方法が格納されている.<br>
77+ * {@link #renumbering(java.util.Map) }したときに設定される.<br>
7978 */
8079 private List<RowNumMap> rowNumMaps = Collections.emptyList();
8180
8281 /**
83- * 列数
82+ * 列数.<br>
83+ * {@link #renumbering(java.util.Map) }したときに設定される.<br>
8484 */
8585 private int numOfColumns;
8686
--- /dev/null
+++ b/src/textkeymatcher/entity/RowFilter.java
@@ -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+}
--- /dev/null
+++ b/src/textkeymatcher/entity/RowKey.java
@@ -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+}
--- /dev/null
+++ b/src/textkeymatcher/entity/RowValues.java
@@ -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+}