首先,我想感谢这个四分钟,因为我发现自己很快就通过这个论坛上的所有材料以及不同成员给我的所有帮助进行了改进。所以这只是非常感谢你们所有这一切。至于我的问题,我一直在尝试输入输出,并想看看这个逻辑是否有效。我试图在适当的数组中得到适当的东西,并想看看这个逻辑是否会这样做。 目前(有一段时间)我不会在一个可以有效访问任何虚拟IDE的地方,所以所有这些都是使用记事本,单词等动态完成的。 * 所以不要我的语法很难。我最关心的是逻辑(如果它可以工作)以及代码中任何重大错误的较小错误。 *
非常感谢。
基本上,文本文件是这样的。标题,一行空格,然后是姓名,年龄和工资,分隔符是#。然后在下面,名称,年龄和工资分隔符带来#etc等。
(假装Bobby,Sandy,Roger,Eric和David之间没有行间距。所以假装在txt文件中他们就在彼此之下,但是信息和bobby之间存在差距。
信息
波比#24#5.75
桑迪#19#10.22Roger#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();
}
}
这个逻辑是否适用于将标题存储在标题字符串,空白数组下的空行,名称数组下的名称,年龄数组下的年龄和工资数组下的工资?
非常感谢。
P.S:主要关注最后一个while循环,我想知道它是否会将名称放在名称数组中,年龄数组中的年龄和工资数组中的工资。答案 0 :(得分: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];
...
}
...
}
}
其次,我认为使用数组完全是错误的方法。就像他对OP的评论中提到的@AVD一样,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” - 所有这些都与同一记录有关。 / p>
最后,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>();
个对象结构替换数组:
// 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
}
在你的while循环中,你将保存到这些对象而不是数组:
// 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
现在,如果您想获取特定记录的数据,您只需要从记录列表中提取PersonData对象并进行查询:
PersonData
由于我们使用的是List而不是数组,因此我们不必担心确切知道文件中有多少条记录,并且我们不会冒丢失信息的风险,因为我们没有有任何地方可以存储它。
这样我们也可以肯定地知道名称,年龄和工资都与同一记录有关,而在我们希望之前,比如数组中索引0处的所有记录都是相同的人
此外,如果您将其他数据添加到记录中 - 例如,名称#age#wage#favorite food - 您只需向{{1}}对象添加一个新字段并添加一行在您的解析方法中将该数据添加到对象。如果您使用的是数组,则需要添加一个新数组,依此类推。
创建逻辑也更容易,例如,如果您有一个只有名称或缺少工资的行,等等 - 这样您实际上能够以某种有意义的方式保存数据。
答案 1 :(得分:0)
如果您希望在Java或任何OOP语言方面取得良好进展,那么您应该始终以面向对象的方式解决问题。
对于手头的问题,你应该总是考虑一个类来存储Person Info而不是使用关联数组。
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]));
}
}