Exes and Ohs in Java


The challenge

Check to see if a string has the same amount of ‘x’s and ‘o’s. The method must return a boolean and be case insensitive. The string can contain any char.

Examples input/output:

XO("ooxx") => true
XO("xooxx") => false
XO("ooxXm") => true
XO("zpzpzpp") => true // when no 'x' and 'o' is present should return true
XO("zzoo") => false

The solution in Java code

Option 1:

import java.util.*;

public class XO {
  
  public static boolean getXO (String str) {
    
    Map<String, Integer> m = new HashMap<>();
    m.put("x", 0);
    m.put("o", 0);
    
    for (int i = 0; i < str.length(); i++){
      char c = str.charAt(i);        
      
      if (Character.toLowerCase(c)=='x')
        m.put("x", m.get("x")+1);
      
      if (Character.toLowerCase(c)=='o')
        m.put("o", m.get("o")+1);
      
    }
    
    return m.get("x")==m.get("o");
    
  }
}

Option 2:

public class XO {
  
  public static boolean getXO (String str) {
    str = str.toLowerCase();
    return str.replace("o","").length() == str.replace("x","").length();
    
  }
}

Option 3:

public class XO {
  
  public static boolean getXO (String str) {
    String xValues = str.replaceAll("[^xX]", "");
    String oValues = str.replaceAll("[^oO]", "");
    
    return xValues.length() == oValues.length();
  }
  
}

Test cases to validate our solution

import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.JUnit4;

public class SolutionTest {
    @Test
    public void testSomething1() {
      assertEquals(true, XO.getXO("xxxooo"));
    }
    
    @Test
    public void testSomething2() {
      assertEquals(true, XO.getXO("xxxXooOo"));
    }
    
    @Test
    public void testSomething3() {
      assertEquals(false, XO.getXO("xxx23424esdsfvxXXOOooo"));
    }
    
    @Test
    public void testSomething4() {
      assertEquals(false, XO.getXO("xXxxoewrcoOoo"));
    }
    
    @Test
    public void testSomething5() {
      assertEquals(false, XO.getXO("XxxxooO"));
    }
    
    @Test
    public void testSomething6() {
      assertEquals(true, XO.getXO("zssddd"));
    }
    
    @Test
    public void testSomething7() {
      assertEquals(false, XO.getXO("Xxxxertr34"));
    }
}