ユーザーごとにクラスを作成するという提案に同意します。これはオブジェクト指向の方法です。そのため、以下の例に含めました。ただし、配列やその他の構造を作成したい場合は、おそらく簡単に変更できます。
ただし、追加したいのは、Java クラスを使用してjava.util.regex.Pattern
、java.util.regex.Matcher
入力文字列からレコードとフィールドの両方を一度に抽出する方法です。(私はAndroid用にプログラムしていませんが、利用できると思います。)
パターンの一般的な計画は次のとおりです。 (レコード区切り文字またはなし)(field1)(delim)(field2)(delim)(lastfield)(レコード区切り文字 + 入力の残り)
アルゴリズムは基本的に、上記のパターンで入力をループします。このパターンは、フィールドのさまざまなグループを抽出し (レコードの形式に応じて)、入力文字列の残りを含む最後のグループも抽出します。この残りは、次のループの新しい入力文字列として使用されます。したがって、ループの反復ごとに 1 つのレコードが実行されます。
実行できるより完全なコード例を次に示します。アルゴリズムの重要な部分であるパターンを理解するには、正規表現について調べる必要があるかもしれません。java.util.regex.Pattern
クラスの Javadoc から始めることができます。
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TestPatternMatch {
public static void main(String[] args) {
List<User> result = new ArrayList<>();
String input =
"Wilson#$20#$Male=@=Raymond#$25#$Male=@=Sophie#$30#$Female";
Pattern recPatt =
Pattern.compile("^(=@=|.{0})(.+?)#\\$(\\d+)#\\$(.+?)(?==@=)(.*$)");
// ^match start of line
// ^match record delimiter or nothing
// ^match name field (reluctant)
// ^match field delim
// ^match age field
// ^match field delim
// match gender field^
// zero-width (non recording) lookahead for record delimiter^
// match rest of line until end^
Matcher recMatcher;
String workStr = input; // start with whole input
while (workStr != null && workStr.length() > 0) {
recMatcher = recPatt.matcher(workStr);
if (recMatcher.matches() && recMatcher.groupCount() >= 5) {
result.add(
new User(
recMatcher.group(2), //name
Integer.parseInt(recMatcher.group(3)), //age
recMatcher.group(4) //gender
)
);
workStr = recMatcher.group(5); // use tail for next iteration
} else {
workStr = null;
}
}
System.out.println(result); //show result list contents
}
}
class User {
String name;
int age;
String gender;
/** All argument constructor */
public User(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
/** Show contents of object fields */
public String toString() {
return "User ["+ name + ", " + age + ", " + gender + "]";
}
}
基本的なパターン構造は、さまざまなレコード形式で再利用できます。