文本文件中的元素未添加到数组中

时间:2014-04-29 18:54:03

标签: java arrays

我试图将Entry对象添加到由Surname,Initial和Extention编号组成的条目数组中。该行的第一个单词是姓氏等。但是当我使用System.out.print(Arrays.toString(entries))打印数组时;它没有打印数组或它是空的。

入门级

public class Entry {

    private String surname, initial, extension;

    public Entry() {

    }

    // shadowing
    public Entry(String line) {

        String[] lines = line.split("\t");
        this.surname = lines[0];
        this.initial = lines[1];
        this.extension = lines[2];


    }

    public void setSurname(String sur) {
        this.surname = sur;

    }

    public void setInitial(String ini) {
        this.initial = ini;
    }

    public void setExtention(String ext) {
        this.extension = ext;
    }

    public String getSurname() {
        return surname;
    }

    public String getInitial() {
        return initial;
    }

    public String getExtension() {
        return extension;
    }

}

数组目录类

import java.io.FileReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;

public class ArrayDirectory implements Directory {

    Entry[] entries = new Entry[0];
    int lines = 0;

    public ArrayDirectory() {

        try {
            Scanner inFile = new Scanner(new FileReader("directory.txt"));

            Scanner lCounter = new Scanner(new FileReader("directory.txt"));

            while (lCounter.hasNext()) {
                lCounter.nextLine();
                lines++;
            }

            entries = new Entry[lines];

            for(int i = 0; i < lines; i++){
                addEntry(inFile.nextLine());
            }

        }

        catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }


    public void addEntry(String l) {
        Entry newEntry = new Entry(l);

        int i = 0;

        while(entries[i] != null) i++;
    }

    public void printTable(){

        System.out.print(Arrays.toString(entries));
    }




}

2 个答案:

答案 0 :(得分:1)

您没有向阵列添加任何内容:

 public void addEntry(String l) {
    Entry newEntry = new Entry(l);

    int i = 0;

    while(entries[i] != null) i++;
  }

您错过了最终entries[i] = newEntry;。当然,一旦你的数组已满,你将获得此代码的异常。您必须确保i不会超过entries.size -1

考虑使用列表而不是数组。

答案 1 :(得分:0)

您的Entry课程需要覆盖toString()方法。这是Arrays.toString()将使用的方法,除非你实现自己的版本,否则它将从java.lang.Object回退到默认值,这对人类不友好。

@Override
public String toString() {
    return String.format("%s. %s", this.initial, this.surname);
}

您可能最好使用更灵活的存储类型,这样您就不必两次读取文件。 ArrayList是合适的,您可以在完成向其添加新条目后将其简单地转换为数组。

你的档案有多大?也许BufferedReader会是更好的选择吗?

File file = new File("directory.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
List<Entry> entries = new ArrayList<Entry>()
while ((line = br.readLine()) != null) {
    entries.add(new Entry(line));
}
br.close();

编辑:您实际上并未将Entry对象添加到阵列中。您应该更改此部分:

entries = new Entry[lines];
for(int i = 0; i < lines; i++){
    addEntry(inFile.nextLine());
}

和这个方法:

public void addEntry(String l) {
    Entry newEntry = new Entry(l);
    int i = 0;
    while(entries[i] != null) i++;
}

你可以在最后一次循环之后添加entries[i] = newEntry;,但这是一种非常糟糕的方式。每次添加新项目时,您都在遍历整个数组。我建议我在上面描述的ArrayList方法。