简体   繁体   中英

Why will my for loop not read my last char of the string?

I am trying to write a basic java program to compress a java string from an input; such as aabbccdddd , into a2b2c2d4 . The program does what I ask except it doesn't process the last char, I am getting an output of a2b2c2 instead of the a2b2c2d4 . What am I doing wrong?

for(x = 0, y = 1; x<input.length()-1; x++)
  {
      if (input.charAt(x) != input.charAt(x+1) && count == 1)
      {
        System.out.print(input.charAt(x));
        System.out.print(count);
      }

      else if (input.charAt(x) == input.charAt(x+y))
      {
        count++;          
      }

      else if (input.charAt(x) != input.charAt(x+1) && count >= 2)
      {
        System.out.print(input.charAt(x));
        System.out.print(count);
        count = 1;

      }
      else
      {
        System.out.println("fail");
      }
  }

You print the count when the next character is not same as the current one. There is no next character for the last character. That is why it is not displayed in the output.

Approach 1

You should add following two lines after the loop:

System.out.print(input.charAt(input.length()-1));
System.out.println(count);

Approach 2

If you do not have problem with modifying the original input. You can add a additional character in the end of the input. This additional character must be a character which will never appear in the original string. Say it is #

Do this before beginning of the loop:

input += "#"; 
for(...)

The loop is incorrect, you have "-1" after input.length(). Try:

    for(x = 0, y = 1; x<input.length(); x++) {
        // CODE HERE...
    }

Your for loop ends before you hit a condition that forces you to print out what's being buffered, ie. count of 4 for the current (last) character. You need to print out the last character and the current count after the loop.

The following should do what you want

public static void main(String[] args) throws Exception {
    String input = "aabbccdddd";
    int count= 1;
    int x, y;
    for (x = 0, y = 1; x < input.length() - 1; x++) {
        char charAtX = input.charAt(x);
        char charAtXPlus1 = input.charAt(x + 1);
        if ( charAtX != charAtXPlus1 && count == 1) {
            System.out.print(input.charAt(x));
            System.out.print(count);
        }

        else if (charAtX == input.charAt(x + y)) {
            count++;
        }

        else if (charAtX != charAtXPlus1 && count >= 2) {
            System.out.print(input.charAt(x));
            System.out.print(count);
            count = 1;

        } else {
            System.out.println("fail");
        }
    }

    System.out.print(input.charAt(x));
    System.out.println(count);
}

You should learn how to use a proper debugger and use proper debugging techniques. For example, I've assigned the value returned by input.charAt(x) to a variable because we reuse that value in the various if-else conditions and because it's easier to see it in a debug window.

You are not able to get the desired result because of the condition

else if(input.charAt(x)!=input.charAt(x+1)&&count>=2)

that fails as there is not character at x+1 location. So, you could add another condition to check if it's the last character and then go ahead with your code

while (input.charAt(x) != input.length()-1)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM