0

このメソッドは、スキャナーを使用して First クラスと 2 番目のクラスのデータを読み取り、2 番目のクラスの ArrayList に格納します。First と Second はメイン クラスから継承されます。私が抱えている問題は、オブジェクトに作成した複製です。

1つだけ作成して両方に使用するにはどうすればよいですか。

import java.io.File;

import java.io.FileNotFoundException;

import java.util.*;

public class Auto {
    private ArrayList<Main> lists;

    public Auto() {
        lists = new ArrayList<Main>();
    }

    public void storeData(Main main) {
        list.add(main);
    }

    public void readFile(String filePath) throws FileNotFoundException {

        File file = new File(filePath);
        Scanner input = new Scanner(file);
        String dataToBe;
        while (input.hasNext()) {
            String lines = input.nextLine().trim();
            Scanner scanner = new Scanner(lines).useDelimiter("\n[ ]*,");
            if (lines.startsWith("Data")) {
                if (lines.startsWith("FirstData")) {
                    dataToBe = "first";
                } else if (lines.startsWith("SecondData")) {
                    dataToBe = "second";
                }

            } else if (dataToBe.equals("first")) {
                Main main = new First();
                main.readData(scanner);
                storeData(main);

            } else if (dataToBe.equals("second")) {
                Main main = new Second();
                main.readData(scanner);
                storeData(main);
            }
        }
    }
}
4

1 に答える 1

1

わかりました、あなたはそれが長ったらしいと思うかもしれませんが、おそらくあなたの制限の下で私がそれを行う方法です.

public void readFile(String filePath) throws FileNotFoundException {

    final Pattern pattern = Pattern.compile("\n[ ]*,");
    final Scanner fileInput = new Scanner(new File(filePath));

    while (fileInput.hasNextLine()) {
        final String line = fileInput.nextLine().trim();
        final Matcher matcher = pattern.matcher(line);
        final StringBuilder builder = new StringBuilder();
        
        byte flag = 0;
        while (matcher.find()) {
            final String match = matcher.group();
            if(match.startsWith("FirstData")){ flag = 1;}
            else if(match.startsWith("SecondData")){flag = 2;}
            builder.append(line).append(",");
        }
        
        Main mainObj = (flag == 1) ? (new First()) : (flag == 2) ? (new Second()) : null;
        if(null != mainObj){
            mainObj.readData(builder.toString());
        }
    }
}

上記のアプローチでは、パラメーターで Scanner の代わりに String を受け入れる必要がありますが、各メソッドに渡される CSV 形式により、各クラスの動作が作業を処理できます。

于 2013-03-20T19:37:02.143 に答える