patternjavaMajor
Perform instruction in loop every time except the last time?
Viewed 0 times
lasttheloopinstructioneverytimeperformexcept
Problem
The specific issue is this: I am writing to a file and want to output a new line after each line written. If I use a normal loop without any further checks, this will create a blank line at the very end of the file for no reason. So I need to do this every time except the last one.
Despite the fact that this is a specific problem, I'm actually looking for a better general coding practice to deal with scenarios like this, since it isn't the first and won't be the last time I have to deal with it.
Here's my unsatisfying solution:
It seems wasteful to check the conditions twice through each iteration of the loop, and I feel like there ought to be a better way to accomplish what I want without the vague code smell. Anyone have any cool tips or tricks to make this more elegant?
It also prevents me from using an enhanced for loop, which makes me sad.
Also, for those saying I should just join all the
Despite the fact that this is a specific problem, I'm actually looking for a better general coding practice to deal with scenarios like this, since it isn't the first and won't be the last time I have to deal with it.
Here's my unsatisfying solution:
//Write contents to the file
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
for(int i = 0; i < lines.size(); i++) {
writer.write(lines.get(i));
if(i < lines.size() - 1) writer.newLine();
}It seems wasteful to check the conditions twice through each iteration of the loop, and I feel like there ought to be a better way to accomplish what I want without the vague code smell. Anyone have any cool tips or tricks to make this more elegant?
It also prevents me from using an enhanced for loop, which makes me sad.
lines is a List.Also, for those saying I should just join all the
Strings with \n, that's not an adequate solution. Firstly, it doesn't actually address the general coding practice. Secondly, when writing to a file with a BufferedWriter, it's important to use newLine() rather than writing a \n.Solution
I presume
As I say, all this does is make it more readable....
Other options are to duplicate the
EDIT: @konijn suggested reversing the newline to happen only after the first line as follows:
lines is a Collection of some sort. One option that has slightly less of a smell (although it still is odoriferous), is to use an iterator, which will essentially do the same work, but will be more readable:for (Iterator it = lines.iterator(); it.hasNext();) {
writer.write(it.next());
if (it.hasNext()) {
writer.newline();
}
}As I say, all this does is make it more readable....
Other options are to duplicate the
write - once in the loop, and then the last one outside the loop:if (!lines.isEmpty()) {
int limit = lines.size() - 1;
for (int i = 0; i < limit; i++) {
....
}
writer.write(lines.get(limit));
}EDIT: @konijn suggested reversing the newline to happen only after the first line as follows:
if (!lines.isEmpty()) {
writer.write(lines.get(0));
// start index at 1 instead of 0.
for (int i = 1; i < lines.size(); i++) {
writer.newline();
writer.write(lines.get(limit));
}
}Code Snippets
for (Iterator<String> it = lines.iterator(); it.hasNext();) {
writer.write(it.next());
if (it.hasNext()) {
writer.newline();
}
}if (!lines.isEmpty()) {
int limit = lines.size() - 1;
for (int i = 0; i < limit; i++) {
....
}
writer.write(lines.get(limit));
}if (!lines.isEmpty()) {
writer.write(lines.get(0));
// start index at 1 instead of 0.
for (int i = 1; i < lines.size(); i++) {
writer.newline();
writer.write(lines.get(limit));
}
}Context
StackExchange Code Review Q#37309, answer score: 24
Revisions (0)
No revisions yet.