有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    循环的一般结构,即伪代码,是这样的(我将使用else,但它的想法与示例代码相同):

    for every character in string {
        if some condition is true {
            ...
        } else {
            output "the condition is false";
            break;
        }
    }
    

    您遇到的问题是,如果字符串中的每个字符(例如,所有字符都相同)的某些条件都为真,您希望采取一些操作(例如,打印字符串)。当然,在你完成循环之前,你不可能知道这一点。典型的方法是找到某种方法,使信息在循环之外可用。考虑这一点,例如:

    boolean atLeastOneFalse = false; // we'll use this flag...
    
    for every character in string {
        if some condition is true {
            ...
        } else {
            output "the condition is false";
            atLeastOneFalse = true; // ...to track if our condition is false...
            break;
        }
    }
    
    if (!atLeastOneFalse) { // ... so we can tell if it was ever false or not when we're done checking.
        output "the condition was always true!";
    }
    

    在这里,我们使用一个标志来跟踪循环外部的循环中发生了什么。如果循环中的每个迭代的条件都为true,那么我们的标志将永远不会被触碰,并且将在循环后保持false。但如果条件是错误的,我们的旗帜就会被设置

    上述方法非常简洁易读。同样的第二种方法(从循环中获取可用信息)是在循环外声明索引计数器,然后在最后检查它的值。例如:

    int n;
    
    for (n = 0; n < final value; ++ n) {
        if some condition is true {
            ...
        } else {
            output "the condition is false";
            break;
        }
    }
    
    if (n == final value) { // then we never broke out of the loop early, therefore the condition was never false
        output "the condition was always true!";
    }
    

    当然,有很多方法可以重新组织上述代码,以尽量减少行数,但我希望在不同时引入太多内容的情况下保持清晰

    这样做的缺点是更容易出错。请注意,“最终值”使用了两次。这意味着,如果通过修改“最终值”来修改代码,则需要更新两行而不是一行。这增加了意外忘记更新的可能性。当然,如果你把“最终值”存储在一个变量中,你可以消除这一点,但我发现标记方法更简单。你总是希望你的代码结构尽可能减少出错的可能性

    还有第三种可能性,你有时可能会看到,那就是检查你是否在循环本身的循环末端(例如,在循环内部,但在循环之后)。我不打算举个例子,因为我不喜欢这种方法。从哲学上讲,它有一些更深层次的组织问题,在某些情况下也可能有绩效问题。我会用上面的国旗法

    希望这些信息足以让您了解如何解决应用程序中的问题