0

Scannerクラスにprevious()メソッドがあれば、私の問題は解決できます。この機能を実現する方法があるかどうかを知るために、この質問をしています。

入力:次のような内容のファイル

a,1
a,2
a,3
b,1
c,1
c,2
c,3
c,4
d,1
d,2
d,3
e,1
f,1

同じアルファベットのすべての行のリストを作成する必要があります。

try {
            Scanner scanner = new Scanner(new File(fileName));
            List<String> procList = null;
            String line =null;
            while (scanner.hasNextLine()){
                line = scanner.nextLine();
                System.out.println(line);
                String[] sParts = line.split(",");
                procList = new ArrayList<String>();
                procList.add(line);
                boolean isSamealpha = true;
                while(isSamealpha){
                    String s1 = scanner.nextLine();
                    if (s1.contains(sParts[0])){
                        procList.add(s1);
                    }else{
                        isSamealpha = false;
                        System.out.println(procList);
                    }
                }
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

私は次のような出力を取得します

a,1
[a,1, a,2, a,3]
c,1
[c,1, c,2, c,3, c,4]
d,2
[d,2, d,3]
f,1
[f,1]

ご覧のとおり、bとeのリストがありません。私がscanner.previous()メソッドを持っている場合、それを2番目のwhileループに入れます。以前の方法がないので行き詰まります。

使用できる方法があれば教えてください。FileUtils.readLines()は3GBのファイルであり、Javaメモリを使用してすべてのファイルを保存したくないため使用できません。

4

2 に答える 2

3

代わりに、アルゴリズムを再検討することをお勧めします。アルゴリズムではシーケンスがいつ壊れたかを判断するために先読みする必要があるため、トークンが欠落していますが、「重複」エントリを配置しているのと同じ構造に次の入力行を収集していません。

逆読みすることなくこれを解決できます。入力が常にソートされていることがわかっている場合は、行ごとに読み取り、最後の行への参照を保持します(現在の行と比較するため)。

于 2013-01-17T17:51:44.673 に答える
1

以下は、役立つはずのサンプルコードです。(これを入力しただけです。チェックはしませんでした。)

Scanner scanner = new Scanner(new File(fileName));
List<String> procList = null;
String line = null;
String previousAlpha = null;
while (scanner.hasNextLine()){
    line = scanner.nextLine();

    if (previousAlpha == null) {
        // very first line in the file
        procList = new ArrayList<String>();
        procList.add(line);
        System.out.println(line);
        previousAlpha = line.split(",")[0];
    }
    else if (line.contains(previousAlpha)) {
        // same letter as before
        procList.add(line);
    }
    else {
        // new letter, but not the very first
        // line
        System.out.println(procList);

        procList = new ArrayList<String>();
        procList.add(line);
        System.out.println(line);
        previousAlpha = line.split(",")[0];

    }
}
于 2013-01-17T18:18:14.600 に答える