0

首先,我要感谢这个fourm,因为我发现自己在这个论坛上的所有材料以及不同成员给我的所有帮助中都在快速进步。因此,这只是非常感谢您所做的一切。至于我的问题,我一直在尝试输入输出,并想看看这个逻辑是否可行。我试图在适当的数组中获取适当的东西,并想看看这个逻辑是否可以做到。目前(并且有一段时间)我不会在一个可以有效访问任何虚拟 IDE 的地方,所以这一切都是使用记事本、word 等即时完成的。 *所以不要对我的语法太苛刻。我最关心的是逻辑(如果它可以工作的话),以及代码中的任何重大错误。*

非常感谢。

所以基本上,文本文件是这样的。标题,一行空格,然后是姓名、年龄和工资,分隔符是#。然后在其下方,姓名,年龄和工资分隔符带来#等。

(假装 Bobby、Sandy、Roger、Eric 和 David 之间没有行空格。所以在 txt 文件中假装他们在彼此下方,但信息和 bobby 之间存在差距。

信息


鲍比#24#5.75

桑迪#19#10.22

罗杰#27#6.73

埃里克#31#8.99

大卫#12#3.50**

这是我想出的逻辑。

public class Practice {

    public static void main(String[] args) throws Exception {

        String Name [] = new String [5];
        int Age [] = new int [5] ;
        double Wage [] = new double [5];
        String Blank [] = new String [5];   

        FileReader inputfile = new FileReader (new File(info.txt));

        BufferedReader InputBuffer = new BufferedReader (inputfile);

        String Title = InputBuffer.readline (); // to get the title 

        int count = 0;

        while (InputBuffer.readline() = null) { // this while loop grabs the blank under the title 

            Blank [count] = count;

        }

        int i = 0;

        while (InputBuffer.readline() !=null)  {        

            String Getter = InputBuffer.readline (); // reads line 
            String splitup= Getter.split(#);    // splits it 

            Name [i] = splitup[i];  // puts name in this array
            Age [i] = splitup([i]  + 1); // age in this array 
            Wage [i] = splitup([i]  + 2); // wage in this array 

         }

        InputBuffer.close();
    }
}

这种逻辑是否适用于将标题存储在标题字符串中、空白数组下的空白行、名称数组下的姓名、年龄数组下的年龄和工资数组下的工资?

非常感谢。

PS:主要关注最后一个while循环,想知道会不会把name放入name数组,age放入age数组,将工资放入wage数组。

4

2 回答 2

0

如果您想在 Java 或任何 OOP 语言方面取得良好进展,您应该始终以面向对象的方式处理问题。

对于手头的问题,您应该始终考虑使用一个类来存储人员信息,而不是使用关联数组。

class PersonInfo {

 PersonInfo(String name,int age,float wage) {
  this.name = name;
  this.age = age;
  this.wage = wage;
 }

String name;
int age;
float wage;

}

上面的代码或多或少是相同的......但它应该给出一个 PeopleInfo 列表作为输出。

List<PersonInfo> peopleInfo = new ArrayList<String>();
boolean isTitleParsed = false; 
while ( (line = inputBuffer.readLine()) != null ) {

    if (!isTitleParsed) {
        // this is the title
        title = line;
        isTitleParsed = true;
        continue;
    } else if (line.isEmpty()) {
        // this is a blank line; logic for dealing with blank lines here
    } else {
        String[] personData = line.split("#");
        if (personData != null && personData.length == 3) {
            peopleInfo.add(new PersonInfo(personData[0],personData[1],personData[2]));
        }

    }
于 2012-08-05T05:57:44.427 回答
0

首先,你只需要一个while循环。我不明白为什么你有两个,特别是因为第一个条件是无意义的(InputBuffer.readline() = null)。

你的循环看起来像这样:

boolean isTitleParsed = false;
String title;
String line;
while ( (line = inputBuffer.readLine()) != null ) {

    if (!isTitleParsed) {
        // this is the title
        title = line;
        isTitleParsed = true;
    } else if (line.isEmpty()) {
        // this is a blank line; logic for dealing with blank lines here
        ...
    } else {
        // this is actual person data
        String[] personData = line.split("#");
        if (personData != null && personData.length == 3) {
            String name = personData[0];
            String age = personData[1];
            String wage = personData[2];
            ...
        }
        ...
    }
}

其次,我认为使用数组是完全错误的方式。就像@AVD 在他对 OP 的评论中提到的那样,List<T>POJO 可能是一个更好的解决方案——并且更具可扩展性。

最后:不,正如您编写的那样,您的第二个循环不会成功地将姓名、年龄和工资保存到数组中。你永远不会增加i,语法splitup([i] + 1)就是错误的。(你可能的意思是splitup[i+1]。)

使用数组

如果您真的坚持使用数组来保存数据,则必须执行以下操作:

String[] names = new String[5];
String[] ages = new String[5];
String[] wages = new String[5];

...

int index = 0;
while ( (line = inputBuffer.readLine()) != null && index < 5) {

    if (!isTitleParsed) {
      ...
    } else if (line.isEmpty()) {
      ...
    } else {
        // this is actual person data
        String[] personData = line.split("#");
        if (personData != null && personData.length == 3) {
            String name = personData[0];
            String age = personData[1];
            String wage = personData[2];

            names[index] = name;
            ages[index] = age;
            wages[index] = wage;
            index++;
        } else {
            System.err.println("Line " + line + " is malformed and was not saved.");
        }
        ...
    }
}

请注意,index它在 0 处实例化,但每次我们将某些内容保存到数组时都会递增。这种方式names[0]将保留第一个名称,names[1]将保留第二个,依此类推。

另请注意,我们将给定记录的名称、年龄和工资都保存在同一索引中。所以我们可以期待names[0]持有“Bobby”、ages[0]持有“24”和wages[0]持有“5.75”——所有这些都与同一个记录有关。

最后,while循环中的条件已修改为(line = inputBuffer.readLine()) != null && index < 5。这意味着我们将继续循环遍历文件的行,直到我们用完行(文件结束)或我们的索引变得大于 5,这是我们实例化数组的大小。这就是为什么数组是一个如此糟糕的结构来保存这些数据的原因之一:你必须确切地知道你的文件中有多少条记录,并且你最终可能没有完全填充它们(你分配了太多空间)或没有保存一些记录,因为您没有更多空间来存储它们。

使用 POJO

保存数据的更好方法是使用 POJO——一个普通的旧 Java 对象。这种对象几乎是一个“数据持有者”对象。

在你的情况下,它会是这样的:

public class PersonData {
    private String name;
    private String wage;
    private String age;

    public PersonData() {
        this(null, null, null);
    }

    public PersonData(String name, String wage, String age) {
        this.name = name;
        this.wage = wage;
        this.age = age;
    }

    // ... getters and setters here
}

在您的代码中,您将用对象List结构替换数组PersonData

List<PersonData> records = new ArrayList<PersonData>();

在您的 while 循环中,您将保存到这些对象而不是数组中:

// in the else in the while loop:
String[] data = line.split("#");
if (data != null && data.length == 3) {
    PersonData record = new PersonData(data[0], data[1], data[2]);    
    records.add(record);
} else {
    // error handling for malformed line
}

现在,如果您想获取特定记录的数据,您只需要从记录列表中提取 PersonData 对象并查询它:

// assuming the first record we scraped was "Bobby#24#5.75"
PersonData person = records.get(0);
person.getName(); // returns "Bobby"
person.getAge(); // returns 24
person.getWage(); // returns 5.75

由于我们使用的是列表而不是数组,因此我们不必担心确切知道文件中有多少条记录,并且我们不会冒丢失信息的风险,因为我们没有任何地方可以存储它。

通过这种方式,我们还可以确定姓名、年龄和工资都与同一条记录相关,而之前我们只是希望数组中索引 0 处的所有记录都与同一个人相关。

此外,如果您向记录添加其他数据——例如,name#age#wage#favorite food——您所要做的就是向PersonData对象添加一个新字段并在解析方法中添加一行来添加该数据到对象。如果您使用的是数组,则需要添加一个新数组,依此类推。

如果您有一行只有名称或缺少工资等等,那么创建逻辑也容易得多 - 这样您实际上就能够以某种有意义的方式保存数据。

于 2012-08-05T05:26:54.640 回答