混合データの文字列、いくつかの単語と数字があります。数値は、整数全体、整数の比率、または整数全体の前のパーセント記号のいずれかです。プログラムの実行中 (データベースではなく)、この情報を Map (それが理にかなっている場合は別のタイプのオブジェクトである可能性があります) に保存しようとしています。パーセント記号を除いて、残りのデータは問題なく解析されます。データがコロン付きの変数のこの正確な形式であると常に期待できます。
正しい出力 (タブは面白いインデントを与えます):
AB: 272/272 CD: 204/529 EFGH: 105 HIJKL: 105 MN: 0 OPQ: 0%
AB 272/272
HIJKL 105
CD 204/529
MN 0
EFGH 105
OPQ 0%
-----------
AB 272/272
CD 204/529
HIJKL 105/1
MN 0/1
EFGH 105/1
OPQ 0/1
1Map<String,String>
枚目は 、2枚目はMap<String,Ratio>
です。自家製の比率よりも良い選択肢があれば、喜んでそれを使用します.
不器用なコード、はい、静的を使いすぎて、コピー/貼り付けを簡単にすることを目的としています:
package regex;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static java.lang.System.out;
class Ratio {
private int numerator;
private int denominator;
private Ratio() {
}
public Ratio(int numerator, int denominator) {
this.numerator = numerator;
this.denominator = denominator;
}
public int getNumerator() {
return numerator;
}
public int getDenominator() {
return denominator;
}
public String toString() {
return numerator + "/" + denominator;
}
}
public class Ratios {
private static String line = "AB: 272/272 CD: 204/529 EFGH: 105 HIJKL: 105 MN: 0 OPQ: 0%";
private static Map<String, String> rawMapStringToString = new HashMap<>();
private static Map<String, Ratio> mapStringToRatio = new HashMap<>();
public static void main(String[] args) {
out.println(line);
populateMap();
printMap(rawMapStringToString);
out.println("-----------");
ratios();
printMap(mapStringToRatio);
}
private static void populateMap() {
Pattern pattern = Pattern.compile("(\\w+): +(\\S+)");
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
rawMapStringToString.put(matcher.group(1), matcher.group(2));
}
}
private static void printMap(Map<?, ?> m) {
for (Map.Entry<?, ?> e : m.entrySet()) {
String key = e.getKey().toString();
String val = e.getValue().toString();
out.println(key + "\t\t" + val);
}
}
private static void ratios() {
Pattern pattern = Pattern.compile("(\\d+)/(\\d+)");
Pattern p2 = Pattern.compile("(\\w+)");
Matcher m2;
int num, den;
Ratio ratio = null;
for (Map.Entry<String, String> e : rawMapStringToString.entrySet()) {
ratio = null;
num = 0;
den = 1;
Matcher matcher = pattern.matcher(e.getValue());
while (matcher.find()) {
num = Integer.parseInt(matcher.group(1));
den = Integer.parseInt(matcher.group(2));
ratio = new Ratio(num, den);
}
if (ratio == null) {
m2 = p2.matcher(e.getValue());
while (m2.find()) {
num = Integer.parseInt(m2.group());
den = 1;
ratio = new Ratio(num, den);
}
}
mapStringToRatio.put(e.getKey(), ratio);
}
}
}
このデータを保存する良い方法を探しています。もちろん、パーセントは比率 x/y として表すことができます。分母を 100 に変更するだけです。それはさておき、Map は良い選択でしょうか?
メソッドと全体的な正規表現はratios
、壊れやすく、ぎこちなく、(私にとって) 従うのが難しいようですが、コードを改善する方法がわかりません。クラスをほとんどそのままにしておくと、どのようにメソッドRatio
を改善できますか?ratios
mapStringToRatio