のような長い文字列を持っています"abc_12.23;dcf_23.99;dfa_12.99;
。
ここで、浮動小数点数と文字列値をそれぞれ浮動小数点数と文字列配列に分離する を作成する必要があります。
「;」で分割してみました それを配列に取り、「_」で分割して配列に抽出しました。しかし、それは機能していませんでした。誰でもこれについて私を助けることができますか??
おそらく、StringTokenizer を使用すると、もう少し効率的かもしれません
StringTokenizer st = new StringTokenizer("abc_12.23;dcf_23.99;dfa_12.99", "_;");
int n = st.countTokens();
String[] sa = new String[n / 2];
float[] fa = new float[n / 2];
for(int i = 0 ; st.hasMoreTokens(); i++) {
sa[i] = st.nextToken();
fa[i] = Float.parseFloat(st.nextToken());
}
スキャナーを使用する場合があります。次のようになります。
scanner = Scanner("abc_12.23;dcf_23.99;dfa_12.99;");
scanner.useDelimiter("[;_]");
while(scanner.hasNext()){
String s = scanner.next();
float f = scanner.nextFloat();
}
あなたの解決策は良いです。
次のアプローチにより、パフォーマンスが少し向上します。
パフォーマンスが大幅に向上するかどうかはわかりません。
注:私はJavaプロではありませんが、Javaが「;」で分割された複数の文字でこぼれることを許可する場合 と "_" を使用し、浮動小数点数には奇数インデックスを使用し、文字列には奇数インデックスを使用しません。
正規表現のソリューションは次のとおりです。
String input = "abc_12.23;dcf_23.99;dfa_12.99; and so on";
String regex = "([a-zA-Z]+)_(\\d+(\\.\\d+)?);?";
List<String> strings = new ArrayList<>();
List<Double> floats = new ArrayList<>();
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
strings.add(matcher.group(1));
floats.add(Double.valueOf(matcher.group(2)));
}
System.out.println(strings); // prints [abc, dcf, dfa]
System.out.println(floats); // prints [12.23, 23.99, 12.99]
次の正規表現を試してください。
(\w.)_(\d.\.\d.);
ここでテストする 正規表現テスト アプレット
matcher.find()
一致をステップ実行するために使用します。
グループ 3 (インデックス 2) には float 値が含まれます。