3

のような一連の文字列を取得しました"(123, 234; 345, 456) (567, 788; 899, 900)"。これらの数値を次のような配列に抽出する方法aArray[0]=123, aArray=[234], ....aArray[8]=900;

ありがとうございました

4

11 に答える 11

6

これはおそらく過度に複雑ですが、干し草...

まず、必要のないものをすべて削除する必要があります...

String[] crap = {"(", ")", ",", ";"};
String text = "(123, 234; 345, 456) (567, 788; 899, 900)";
for (String replace : crap) {
    text = text.replace(replace, " ").trim();
}
// This replaces any multiple spaces with a single space
while (text.contains("  ")) {
    text = text.replace("  ", " ");
}

次に、文字列の個々の要素をより管理しやすい形式に分離する必要があります

String[] values = text.split(" ");

次に、各String値をint

int[] iValues = new int[values.length];
for (int index = 0; index < values.length; index++) {

    String sValue = values[index];
    iValues[index] = Integer.parseInt(values[index].trim());

}

次に、値を表示します...

for (int value : iValues) {
    System.out.println(value);
}
于 2012-10-04T06:23:11.697 に答える
5

戦略:リストに追加する正規表現を使用して、一緒になっている1つ以上の数値を見つけます。

コード:

    LinkedList<String> list = new LinkedList<>();
    Matcher matcher = Pattern.compile("\\d+").matcher("(123, 234; 345, 456) (567, 788; 899, 900)");
    while (matcher.find()) {
        list.add(matcher.group());
    }
    String[] array = list.toArray(new String[list.size()]);
    System.out.println(Arrays.toString(array));

出力:

[123, 234, 345, 456, 567, 788, 899, 900]
于 2012-10-04T06:55:28.143 に答える
5

あなたはほぼ確実に引用を見てきました:

問題に直面したときに、「わかっている、正規表現を使用する」と考える人もいます。今、彼らは2つの問題を抱えています。

しかし、正規表現は本当にこの種のことのあなたの友達です。

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Numbers {
    public static void main(String[] args) {
        String s = "(123, 234; 345, 456) (567, 788; 899, 900)";
        Matcher m = Pattern.compile("\\d+").matcher(s);
        List<Integer> numbers = new ArrayList<Integer>();
        while(m.find()) {
            numbers.add(Integer.parseInt(m.group()));
        }
        System.out.println(numbers);
    }
}

出力:

[123, 234, 345, 456, 567, 788, 899, 900]
于 2012-10-04T06:57:57.017 に答える
2

Iterate through each character and store numbers in a temporary array until you find a character(like ,, ;) then store the data from temporary array into your array and then empty that temporary array for next use.

于 2012-10-04T06:12:18.207 に答える
0

正規表現を使用して結果を取得できると思います。このようなものかもしれません:

String string = "(123, 234; 345, 456) (567, 788; 899, 900)";
String[] split = string.split("[^\\d]+");
int number; 
ArrayList<Integer> numberList = new ArrayList<Integer>();

for(int index = 0; index < split.length; index++){
    try{
        number = Integer.parseInt(split[index]);
        numberList.add(number);
    }catch(Exception exe){

    }
}

Integer[] numberArray = numberList.toArray(new Integer[numberList.size()]);
for(int index = 0; index < numberArray.length; index++){
    System.out.println(numberArray[index]);
}
于 2012-10-04T06:31:17.427 に答える
0
 for (int i = 0; i < faces.total(); i++) 
 {
    CvRect r = new CvRect(cvGetSeqElem("(123, 234; 345, 456)", i));             
    String x=""+Integer.toString(r.x());
    String y=""+Integer.toString(r.y());
    String w=""+Integer.toString(r.width());
    String h=""+Integer.toString(r.height());
    for(int j=0;j<(4-Integer.toString(r.x()).length());j++)   x="0"+x;
    for(int j=0;j<(4-Integer.toString(r.y()).length());j++)   y="0"+y;
    for(int j=0;j<(4-Integer.toString(r.width()).length());j++)   w="0"+w;
    for(int j=0;j<(4-Integer.toString(r.height()).length());j++)   h="0"+h;
    r_return=""+x+y+w+h;
 }

上記のコードは文字列「0123023403540456」を返します

int[] rectArray = new int[rectInfo.length()/4];
for(int i=0;i<rectInfo.length()/4; i++)
{
    rectArray[i]=Integer.valueOf(rectInfo.substring(i*4, i*4+4));
}

[123, 234, 345, 456] になります。

于 2012-10-04T12:11:23.970 に答える
0

数字は特定の文字セットで区切られているため、.split(String regex)メソッドを確認できます。

于 2012-10-04T06:13:36.497 に答える
0

文字列にはさまざまな区切り文字が含まれている可能性があるため、それを調べて、数字以外のすべての文字を に置き換えることができますspacessplit("\\s")次に、文字列を数字付きの部分文字列の配列に分割するために使用できます。そして最後にそれらを数値に変換します。

于 2012-10-04T06:15:51.860 に答える
0

このメソッドは、指定された文字列から整数を抽出します。また、例の文字だけでなく、数字を区切るために他の文字が使用されている文字列も処理します。

public static Integer[] extractIntegers( final String source ) {
    final int    length = source.length();
    final char[] chars  = source.toCharArray();

    final List< Integer > list = new ArrayList< Integer >();

    for ( int i = 0; i < length; i++ ) {

        // Find the start of an integer: it must be a digit or a sign character
        if ( chars[ i ] == '-' || chars[ i ] == '+' || Character.isDigit( chars[ i ] ) ) {
            final int start = i;

            // Find the end of the integer:
            for ( i++; i < length && Character.isDigit( chars[ i ] ); i++ )
                ;

            // Now extract this integer:
            list.add( Integer.valueOf( source.substring( start, i ) ) );
        }
    }

    return list.toArray( new Integer[ list.size() ] );
}

注:内部forループは整数の後にあり、外部forループは次の整数を検索するときに変数を増やすためi、アルゴリズムでは整数を区切るために少なくとも 1 文字が必要になりますが、これは望ましいことだと思います。たとえば、"-23-12"ソースは数値を生成し[ -23, 12 ]、NOTを生成します[ -23, -12 ](ただし"-23 -12"、期待どおりに [ -23, -12 ] を生成します)。

于 2012-10-04T06:19:07.487 に答える
0

最も簡単なアプローチは、String.indexOf()(またはこのようなもの) とNumberFormat.parse(ParsePosition)メソッドの組み合わせを使用することです。アルゴリズムは次のようになります。

  1. 文字列の先頭から開始
  2. その位置から始まる数を見つける
  3. 数字以外の文字で停止し、値を返す NumberFormat の前述のメソッドを使用して解析します
  4. 2) その位置から (文字列の最後に到達するまで) 繰り返します。

同時に、文字列には特定の構造があるため、形式の正確性もチェックするため、IMHO パーサーの方が適切なアプローチになります (必要な場合はわかりません)。文法の記述から Java コードを生成するツールはたくさんあります (ANTLR など)。しかし、この場合の解決策は複雑すぎるかもしれません。

于 2012-10-04T06:23:05.187 に答える
0

さらに別の方法。より少ないコードを書きたい場合は良いかもしれませんが、プロジェクトにライブラリを追加できない場合は悪いかもしれません

import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;

public static void main(String[] args) throws IOException {
        String text = "(123, 234; 345, 456) (567, 788; 899, 900)";
        Splitter splitter = Splitter.onPattern("[,;\\)\\(]").omitEmptyStrings();
        String[] cleanString = Iterables.toArray(splitter.split(text), String.class);

        System.out.println(Arrays.toString(cleanString));

    }

AM 教祖はそれをさらにきれいにすることができると確信しています。

于 2012-10-04T06:53:04.550 に答える