1

この投稿をstackoverflowで検証した後、メソッドを使用しindexOf()てファイルから値を解析しています。以下は私のファイルの形式です-

10/05/2005 10:02;AM;a@xyz.com;student=student1 std=X marks=87 rollnumber=102
10/05/2005 10:05;AM;b@xyz.com;student=student2 std=IX rollnumber=26
10/05/2005 10:15;PM;c@xyz.com;student=student3 std=VII marks=87 attandance=5 rollnumber=12
10/05/2005 10:32;AM;d@xyz.com;student=student4 std=V marks=87 rollnumber=69

注: 電子メールのdomain nameiexyz.comは、どこでも変更される予定はありません。
以下は、私が現在使用しているコードスニペットです-

            FileInputStream fis = new FileInputStream(file);
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    fis));

            String line = "";
            while ((line = br.readLine()) != null) {

                int index = -1;

                if ((index = line.indexOf("xyz.com")) != -1) {
                    int inStudent = line.indexOf("student=", index);
                    int spaceExistsinStudent = -1;
                    int studentIndex = -1;

                    if ((spaceExistsinStudent = line.indexOf("student=\"", inStudent)) != -1)
                        studentIndex = line.indexOf(" ", inStudent);
                    else
                        studentIndex = line.indexOf("\" ", spaceExistsinStudent);

                    int inSTD = line.indexOf("std=", studentIndex);
                    int spaceExistsinSTD = -1;
                    int stdIndex = -1;

                    if ((spaceExistsinSTD = line.indexOf("std=\"", inSTD)) != -1)
                        stdIndex = line.indexOf(" ", inSTD);
                    else
                        stdIndex = line.indexOf("\" ", spaceExistsinSTD);

                    String studentName = line.substring(inStudent + 9, studentIndex);
                    String stdName = line.substring(inSTD + 4, stdIndex);

コード全体を貼り付ける必要はありません。
さて、上記の実装を使用して、私は動作することができますが、パフォーマンスを考慮すると、これは有効なソリューションですか? 同じことを達成するためのより良い方法....
よろしくお願いします。

4

3 に答える 3

2

indexOf() の代わりに、StringTokenizer をお勧めします。基本的に、区切り文字に基づいて文字列を分割できます (例: ;)。

while ループ内の例

        StringTokenizer st = new StringTokenizer(line,";");


        st.nextToken(); //Date
        st.nextToken(); //AM
        String email = st.nextToken();
        String values = st.nextToken();

        StringTokenizer st2 = new StringTokenizer(values," ");


        while (st2.hasMoreElements()) {
            String token = (String) st2.nextElement();
            if(token.startsWith("student=")){
                System.out.println(token.substring("student=".length()));
            }else if(token.startsWith("std=")){
                System.out.println(token.substring("std=".length()));
            }

        }
于 2012-09-10T16:14:28.540 に答える
1

すべてにindexOfを使用する必要はありません。1つの文字を見たい場合は、charAt()を使用できます。たとえば、'"'をチェックしている場合です。

コードを単純化するために、フィールドの値を抽出するメソッドを使用します。

于 2012-09-10T16:04:46.600 に答える