在程序

时间:2017-11-26 10:06:21

标签: java arraylist

所以我得到了Konto的Java类,它得到了:

private String navn;
private int medlemdsnummer;
private String årstal;
private String måned;
private String dag;
LocalDate localDate;

它们的用法如下:

ArrayList<Konto> kontoArrayList = new ArrayList<>();

在程序关闭之前,我将ArrayList保存为.txt文档:

private static void saveToFile(ArrayList<Konto> kontoArrayList) throws IOException {

    String content = new String(Files.readAllBytes(Paths.get("medlemmer.txt")));
    PrintStream printStream = new PrintStream("medlemmer.txt");

    for (int i = 0; i < kontoArrayList.size(); i++) {

        printStream.println(content + kontoArrayList.get(i).getMedlemdsnummer() + ": " + kontoArrayList.get(i).getNavn() + " " +
                kontoArrayList.get(i).getLocalDate());

    }


}

他们最终在.txt文件中看起来像这样:

1: Kasper 1996-11-20
2: Jonas 1996-04-27
3: Jesper 1996-05-14

好的,到目前为止一切顺利。现在的问题是:当程序打开时,我想让它能够从头开始加载.txt文件,然后转移&#34;它到Konto的ArrayList。所以我以后可以使用我的方法(addNewMember)。我在互联网上看到很多例子,但他们都使用:

ArrayList<String> somename = new ArrayList<String>();

我想用:

ArrayList<Konto> konto = new ArrayList<Konto>();

这是可能的,如果是这样的话怎么办? 如果不是我能做什么呢?

提前致谢,Victor。

3 个答案:

答案 0 :(得分:1)

我认为你可以尝试的一种方法是逐行阅读,并定义一个接受字符串的Konto构造函数。

编辑:您可以按照Lucem的以下答案进行操作。但我想我会做的有点不同

List<String> strings = Files.readAllLines(Paths.get("fileName.txt"));
List<Konto> kontos = new ArrayList<>();
for (String s: strings) {
    kontos.add (new Konto(s))
}

或使用Stream s:

List<Konto> kontos = Files.lines(Paths.get("fileName.txt"))
    .map(line -> new Konto(line));
    .collect(Collectors.toList());

然后在Konto类中添加一个接受字符串并对其进行操作的构造函数。因为你没有在这里添加类Konto,所以我不知道你的属性的确切名称,所以我让它成为“yourPropertyNumber”,“yourPropertyString”和“yourPropertyDate”

class Konto {
    public Konto (String input) {
        // Split based on white space 
        String[] dataParts = input.split(" ");

        // Get rid of the semicolon
        String number = dataParts[0].substring(0, dataParts[0].length - 1);
        yourPropertyNumber = parseInt(number);
        yourPropertyString = dataParts[1];
        yourPropertyDate = new Date(dataParts[2]);
    }
    // Your other code here
}

我想将String传递给构造函数而不是解析我读取文件的字符串的原因是我认为调试或更改它读取字符串的方式更容易。

希望这有帮助。

答案 1 :(得分:1)

如下所示,你必须检查它

class TestParse {
    public TestParse(String line) {
        StringTokenizer tokenizer = new StringTokenizer(line, ",");

        if(tokenizer.countTokens() != 3) {
            throw new RuntimeException("error");        
        }

        s1 = tokenizer.nextToken();
        s2 = tokenizer.nextToken();
        s3 = tokenizer.nextToken();
    }

    private String s1;
    private String s2;
    private String s3;
}

public class TestRead {
    public static void main(String[] args) throws Exception {
        List<TestParse> testParses = new ArrayList<TestParse>();

        BufferedReader in = new BufferedReader(new FileReader("file.txt"));

        String line;

        while((line = in.readLine()) != null) {
            testParses.add(new TestParse(line));
        }

        in.close(); 
    }
}

答案 2 :(得分:1)

您可以从文件中读取所有行作为字符串,并按空格分割此字符串。 然后使用解析选项创建新对象。 像这样:

List<String> strings = Files.readAllLines(Paths.get("test.txt"));
List<Konto> kontos = new ArrayList<>();
for (String string : strings) {
    String[] data = string.split(" ");
    kontos.add(new Konto(data[1], new Date(data[2])));
}

或使用Stream s:

List<Konto> kontos = Files.lines(Paths.get("test.txt"))  // String
    .map(line -> line.split(" "))                        // String[]
    .map(data -> new Konto(data[1], new Date(data[2]))   // Konto
    .collect(Collectors.toList());