分割数组并组织成多个数组的有效方法

时间:2013-03-06 10:02:33

标签: java android string

我有一个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

上面的部分实际上是从服务器返回的值,我想处理这个值。谢谢你的回复。我认为我在理论上有点理解,但我在实施代码时遇到了一些问题。

5 个答案:

答案 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.Patternjava.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];
  }
}