java检查循环是否在没有条件中断的情况下运行
我目前有一个编程任务。在这项作业中,我得到了一个随机的Ascii图像。我的工作是把它转换成CSV格式。例如: ascii图像:
3
**
******
** *+
csv格式:
3
2, ,2,*,2,
6,*
2, ,2*,1, ,1,*,1,+
这是我的代码:
public static void imageToNumRep(File input, File output)
throws FileNotFoundException
{
Scanner in = new Scanner(input);
PrintStream out = new PrintStream(output);
while(in.hasNextLine())
{
int count = 0;
String text = in.nextLine();
for (int i = 0; i <= text.length() -2; i++)
{
if (text.charAt(i) == text.charAt(i + 1))
{
count++;
}
if (text.charAt(i) != text.charAt(i + 1))
{
System.out.print(count+1+ "," + text.charAt(i)+ ", ");
count = 0;
}
}
int count2 = 0;
for (int j = text.length()-1 ; j>0 ; j--)
{
if (text.charAt(j - 1) == text.charAt(j))
{
count2++;
}
if (text.charAt(j) != text.charAt(j - 1))
{
System.out.println(count2 + 1 + "," + text.charAt(j));
count2 = 0;
break;
}
}
}
}
我想做的是,我会浏览图片中的每一行。 在每一行中,我将从第一个字符转到最后一个字符,或者相反。如果当前字符与下一个字符相同,我将使用计数器进行计数。当我到达当前字符与下一个字符或上一个字符不相同的点时,我将打印出计数和字符,指示我刚刚穿过的字符数量,然后重置计数
问题是,这段代码只适用于具有不同字符的行。当我在一行中从头到尾使用相同的字符时,我无法打印该行,因为我需要在该行中使用不同的字符才能打印。有什么想法吗
# 1 楼答案
循环的一般结构,即伪代码,是这样的(我将使用
else
,但它的想法与示例代码相同):您遇到的问题是,如果字符串中的每个字符(例如,所有字符都相同)的某些条件都为真,您希望采取一些操作(例如,打印字符串)。当然,在你完成循环之前,你不可能知道这一点。典型的方法是找到某种方法,使信息在循环之外可用。考虑这一点,例如:
在这里,我们使用一个标志来跟踪循环外部的循环中发生了什么。如果循环中的每个迭代的条件都为true,那么我们的标志将永远不会被触碰,并且将在循环后保持
false
。但如果条件是错误的,我们的旗帜就会被设置上述方法非常简洁易读。同样的第二种方法(从循环中获取可用信息)是在循环外声明索引计数器,然后在最后检查它的值。例如:
当然,有很多方法可以重新组织上述代码,以尽量减少行数,但我希望在不同时引入太多内容的情况下保持清晰
这样做的缺点是更容易出错。请注意,“最终值”使用了两次。这意味着,如果通过修改“最终值”来修改代码,则需要更新两行而不是一行。这增加了意外忘记更新的可能性。当然,如果你把“最终值”存储在一个变量中,你可以消除这一点,但我发现标记方法更简单。你总是希望你的代码结构尽可能减少出错的可能性
还有第三种可能性,你有时可能会看到,那就是检查你是否在循环本身的循环末端(例如,在循环内部,但在循环之后)。我不打算举个例子,因为我不喜欢这种方法。从哲学上讲,它有一些更深层次的组织问题,在某些情况下也可能有绩效问题。我会用上面的国旗法
希望这些信息足以让您了解如何解决应用程序中的问题