Friday, August 17, 2012

Write a method to decide if two strings are anagrams or not

Write a method to decide if two strings are anagrams or not.

import java.util.HashMap;
import java.util.Map;
import junit.framework.TestCase;
/**
 * Write a method to decide if two strings are anagrams or not.
 */
public class StringAnagrams extends TestCase {
  public static boolean areAnagrams(String s1, String s2) {
    if (s1 == null) {
      throw new NullPointerException("Argument 's1' can not be null.");
    }
    if (s2 == null) {
      throw new NullPointerException("Argument 's2' can not be null.");
    }
    Map<Character, Integer> charMap = new HashMap<Character, Integer>();
    stringIntoCharMapWithValues(s1, charMap, 1);
    stringIntoCharMapWithValues(s2, charMap, -1);
    return isMapOfNumbersAllZeroes(charMap);
  }
  public static <K, V extends Number> boolean isMapOfNumbersAllZeroes(
      Map<K, V> map) {
    for (Number i : map.values()) {
      if (!i.equals(0)) {
        return false;
      }
    }
    return true;
  }
  public static void stringIntoCharMapWithValues(String string,
      Map<Character, Integer> map, int value) {
    int length = string.length();
    for (int i = 0; i < length; i++) {
      char c = string.charAt(i);
      if (Character.isWhitespace(c)
          || (!Character.isLetter(c) && !Character.isDigit(c))) {
        continue;
      }
      if (map.containsKey(c)) {
        map.put(c, map.get(c) + value);
      } else {
        map.put(c, value);
      }
    }
  }
  public static void testAreAnagrams() {
    try {
      areAnagrams(null, "a");
    } catch (NullPointerException e) {
    }
    try {
      areAnagrams("a", null);
    } catch (NullPointerException e) {
    }
    try {
      areAnagrams(null, null);
    } catch (NullPointerException e) {
    }
    assertTrue(areAnagrams("", ""));
    assertTrue(areAnagrams("a", "a"));
    assertFalse(areAnagrams("a", ""));
    assertFalse(areAnagrams("", "a"));
    assertTrue(areAnagrams("ab", "ab"));
    assertTrue(areAnagrams("ab", "ba"));
    assertFalse(areAnagrams("ab", "bc"));
    assertFalse(areAnagrams("ab", "b c"));
    assertTrue(areAnagrams("ab", "b a"));
    assertTrue(areAnagrams(" ab", "ba "));
    assertTrue(areAnagrams("a4 b", "4b a"));
    assertFalse(areAnagrams("a4 b", "5b a"));
    assertFalse(areAnagrams("aa", "a"));
    assertTrue(areAnagrams("a,b,c.", "- 'c b a'"));
  }
}

No comments:

Post a Comment