我有一个String[]
,其中包含多个用户详细信息。像这样:
Wilson#$20#$Male=@=Raymond#$25#$Male=@=Sophie#$20#$Female
我想将字符串拆分并将其组织成多个数组。例如Name
的一个数组,Age
的一个数组和Gender
的另一个数组。到目前为止,我设法将String[]
分成了类似的东西。
String[] User = student.split("=@=");
User[0] = Wilson#$20#$Male
User[1] = Raymond#$25#$Male
User[2] = Sophie#$20#$Female
从这一点来说,我真的不知道如何组织它。任何评论和答案都非常感谢!
修改
Wilson#$20#$Male=@=Raymond#$25#$Male=@=Sophie#$20#$Female
上面的部分实际上是从服务器返回的值,我想处理这个值。谢谢你的回复。我认为我在理论上有点理解,但我在实施代码时遇到了一些问题。
答案 0 :(得分:2)
创建一个用户对象来存储所有字段(名称,年龄,性别)并创建一个列表来保存所有数据。
答案 1 :(得分:2)
这里最好的选择是使用一个对象来保存这些值。对象是在一个对象中保存彼此相关的值的标准方法。即:
public class Person
{
private String name;
private int age;
private String gender;
// Gender could be a boolean value really, but you've stored it as a String.
}
在构造函数中,您将请求每个值并将其分配给这些字段。它看起来像是:
public Person(String name, int age, String gender)
{
this.name = name;
// etc etc
}
这样你就有了一个数组,不需要对字符串进行任何标记来获得单个值:)。您还需要实现一些Accessors and Mutators来获取Object中的值。
答案 2 :(得分:2)
我同意为每个用户创建一个类的建议 - 它是面向对象的方式。所以我把它包含在下面的例子中。但是如果你想做数组或其他结构,你可能很容易改变它。
但是,我要添加的是一种使用Java类java.util.regex.Pattern
和java.util.regex.Matcher
从输入字符串一次提取记录和字段的方法。 (我没有为Android编程,我认为它们可用。)
模式的一般计划是:(记录分隔符或没有)(field1)(delim)(field2)(delim)(lastfield)(记录分隔符+输入的其余部分)
该算法基本上通过上述模式循环输入。该模式为字段提取各种组(取决于记录的格式),然后提取包含输入字符串其余部分的最后一个组。该余数用作下一个循环的新输入字符串。因此,循环的每次迭代都会执行一条记录。
这是您可以运行的更完整的示例代码。您可能需要研究正则表达式来理解模式,这是算法的重要部分。您可以从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 + "]";
}
}
基本模式结构可以重复用于许多不同的记录格式。
答案 3 :(得分:1)
为什么不创建User
类并维护User
个实例列表。
class User {
String name;
String gender;
int age;
}
答案 4 :(得分:0)
最好的解决方案是创建一个类User。如果您想避免它,请尝试:
String[] User = student.split("=@=");
String [][] details=new String[user.length][3];
String [] temp=new String[3];
for(int i=0;i<User.length;i++){
temp=User.split("//");
for(j=0;j<3;j++){
details[i][j]=temp[j];
}
}