2

入力からcoollectionにすべての数値を追加してソートしたいと思います。

私はそのような入力ファイルを持っています:

12i -+3456i
78,i910 
11
i-12i


13.14r
15.r16r
i17.18

-+19.20
+r21.22
+23.242526r

+-27.28r
-29.30r
-.313233r
r-0.343536rr


r.34r
3536.r
r+37.38

Liczba -0.1234 jest mniejsza niz liczba .2 i wieksza niz liczba -1;

i123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789i

もちろん、Integer、Double、BigInteger などがあります。それらを Collection に入れて並べ替えたいと思います。この入力を 3 回パスすれば、これは難しくありません。

1. Create regex for integers and filter the input add those integers into collection
2.  Create regex for doubles and filter the input add those doubles into collection
3.  Create regex for bigIntegers and filter the input add those bigIntegers into collection
4.Sort this collection of BigDecimals.

しかし、これはばかげているようです。これらすべての数値を入力の 1 回のパスでコレクションに入れる方法はありますか? 正規表現の使用。

編集:

12,12 == 12.12 --> double
12i --> i does not count this is integer 12

EDIT2: 正しい出力順序

-29.30
-27.28
-12
-1
-0.343536
-0.313233
-0.1234
0.2
0.34
11
12
13.14
15
16
17.18
19.20
21.22
23.242526
37.38
78
910
3456
3536
123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789
4

3 に答える 3

4
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    matchList.add(regexMatcher.group());
} 

ArrayListすべての正規表現の一致を提供します。Java を知っていれば、ArrayList代わりに BigDecimals に変更する方法をお見せできると思いますが、自分でできると思います。あとは並べるだけ。

説明:

-?          # Match an optional minus sign.
(?:         # Either match:
 \d+        # a number,
 (?:\.\d+)? # optionally followed by a decimal part
|           # or
 \.\d+      # just a decimal part
)           # End of alternation

regex101で実際の動作を確認してください。

(編集:多くの空の一致を生成しない新しいバージョン(古いものも空の文字列に一致していました)

于 2013-01-15T17:54:26.080 に答える
0

すべての数値に対して正規表現を 1 つだけ作成し、次のよう"[+-]?\\d*[,.]?\\d*"にして BigDecimals として解析できます。new BigDecimal(matcher.group().replace(",", ".")

于 2013-01-15T17:51:13.057 に答える
0

私は次のことをします

public static List<Number> parse(Reader reader) throws IOException {
    List<BigDecimal> numbers = new ArrayList<>();
    StringBuilder num = new StringBuilder();
    for (int ch; (ch = reader.read()) >= 0; ) {
        if ((ch >= '0' && ch <= '9') || ch == '.' || ch == '-') {
            num.append((char) ch);
        } else {
            removeLast(num, '.');
            removeLast(num, '-');
            if (num.length() > 0)
                numbers.add(new BigDecimal(num.toString()));
            num.setLength(0);
        }
    }
    Collections.sort(numbers);
    List<Number> ret = new ArrayList<>();
    for (BigDecimal bd : numbers) {
        if (bd.compareTo(BigDecimal.valueOf(bd.intValue())) == 0) {
            ret.add(bd.intValue());
        } else if (bd.setScale(0, RoundingMode.DOWN).compareTo(bd) == 0) {
            ret.add(bd.setScale(0, RoundingMode.DOWN).toBigInteger());
        } else {
            ret.add(bd.doubleValue());
        }
    }
    return ret;
}

private static void removeLast(StringBuilder num, char ch) {
    if (num.length() > 0 && num.charAt(num.length() - 1) == ch)
        num.setLength(num.length() - 1);
}

public static void main(String... args) throws IOException, InterruptedException {
    String text = "12i -+3456i\n" +
            "78,i910 \n" +
            "11\n" +
            "i-12i\n" +
            "\n" +
            "\n" +
            "13.14r\n" +
            "15.r16r\n" +
            "i17.18\n" +
            "\n" +
            "-+19.20\n" +
            "+r21.22\n" +
            "+23.242526r\n" +
            "\n" +
            "+-27.28r\n" +
            "-29.30r\n" +
            "-.313233r\n" +
            "r-0.343536rr\n" +
            "\n" +
            "\n" +
            "r.34r\n" +
            "3536.r\n" +
            "r+37.38\n" +
            "\n" +
            "Liczba -0.1234 jest mniejsza niz liczba .2 i wieksza niz liczba -1;\n" +
            "\n" +
            "i123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789i\n";
    for (Number number : parse(new StringReader(text))) {
        System.out.println(number);
    }
}

版画

-29.3
-27.28
-12
-1
-0.343536
-0.313233
-0.1234
0.2
0.34
11
12
13.14
15
16
17.18
19.2
21.22
23.242526
37.38
78
910
3456
3536
123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789

注: int、double、BigInteger のいずれも、またはとして出力されません-29.3019.20

于 2013-01-15T18:00:25.453 に答える