Java  1.0
palindromes.java
Go to the documentation of this file.
1 import java.text.Normalizer;
2 import java.util.regex.Pattern;
3 
72 public class palindromes {
73 
84  public static boolean isPalindrome (String s) {
85  int i, j;
86  s = s.toUpperCase();
87  for (i = 0, j = s.length()-1; i < j; i++, j--) {
88  if (s.charAt(i) != s.charAt(j))
89  return false;
90  }
91  return true;
92  }
93 
100  public static String reverse (String s) {
101  int i, j;
102  StringBuilder str = new StringBuilder(s);
103  for (i = 0, j = s.length()-1; i < j; i++, j--) {
104  str.setCharAt(i, s.charAt(j));
105  str.setCharAt(j, s.charAt(i));
106  }
107  return str.toString();
108  }
109 
111  public static String revString (String str) {
112  if (str.length() == 0)
113  return str;
114  return revString(str.substring(1)) + str.charAt(0);
115  }
116 
123  public static String reverseWords (String s) {
124  StringBuffer str = new StringBuffer();
125  for (String part : s.split(" ")) {
126  str.append (new StringBuffer(part).reverse()+" ");
127  }
128  return str.toString();
129  }
130 
141  public static String deAccent(String str) {
142  String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD);
143  Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
144  return pattern.matcher(nfdNormalizedString).replaceAll("");
145  }
146 
153  public static String removeSpacesAndPonctuation (String s) {
154  StringBuffer s1 = new StringBuffer();
155  String unWantedChars = " -,:;._'!";
156  for ( int i = 0; i < s.length(); ++i ) {
157  char c = s.charAt(i);
158  if ( unWantedChars.indexOf(c) < 0 ) // remove spaces and punctuation
159  s1.append (Character.toUpperCase(c));
160  }
161  return s1.toString();
162  }
163 
176  public static boolean areAnagrams (String s1, String s2) {
179  char[] str1 = s1.toCharArray();
180  java.util.Arrays.sort(str1);
181  s1 = new String(str1);
182  char[] str2 = s2.toCharArray();
183  java.util.Arrays.sort(str2);
184  s2 = new String(str2);
185  return s1.equals(s2);
186  }
187 
188  public static boolean isAnagram(String a, String b) {
189  int[] first = new int[26];
190  int[] second = new int [26];
191  int c = 0;
192 
193  // first[0] will contain the number of 'a's of a
194  // first[1] will contain the number of 'b's of a
195  // first[26] will contain the number of 'z's of a
196  for ( c = 0; c < a.length(); ++c ) {
197  int i = Character.toLowerCase(a.charAt(c))-'a';
198  if ( i > 0 && i < 26 )
199  first[i]++;
200  }
201 
202  for ( c = 0; c < b.length(); ++c ) {
203  int i = Character.toLowerCase(b.charAt(c))-'a';
204  if ( i > 0 && i < 26 )
205  second[i]++;
206  }
207 
208  for (c = 0; c < 26; c++) {
209  if (first[c] != second[c])
210  return false;
211  }
212  return true;
213  }
214 
226  public static boolean areMutualPalindromes (String s1, String s2) {
227  s1 = new StringBuffer(s1).reverse().toString();
228  return s1.equals(s2);
229  }
230 
241  public static boolean isPhrasePalindrome (String s) {
242  String s2 = deAccent (removeSpacesAndPonctuation(s));
243  return palindromes.reverse(s2).equals(s2);
244  }
245 
252  public static void printPalindromeNumbers (int start, int amount) {
253  for ( int i = start, cnt = 0; cnt < amount; ++i )
254  // check whether the string representing i is a palindrome
255  if (isPalindrome (baseConverter.itoa(i,10))) {
256  System.out.print ( String.format ("%d = %d\n", cnt+1, i) );
257  ++cnt;
258  }
259  }
260 
266  public static void main(String[] args) { // args is an array of Strings
267  palindromes p = new palindromes(); // never forget to instanciate an object of your new class
268  if (args.length == 1) { // only one argument
269  boolean p1 = p.isPalindrome (args[0]);
270  boolean p2 = p.isPhrasePalindrome (args[0]);
271  System.out.println ( "\"" + args[0] + "\"" + String.format(" is%s a palindrome", p1?"":" not") );
272  System.out.println ( "\"" + args[0] + "\"" + String.format(" is%s a palindrome phrase\n", p2?"":" not") );
273  System.out.println ( p.reverse (args[0]) );
274  System.out.println ( p.revString (args[0]) );
275  System.out.println ( p.reverseWords (args[0]) );
276  System.out.println ( p.deAccent (args[0]) );
277  } else if (args.length > 1) { // two or more arguments
278  boolean a = p.areAnagrams (args[0], args[1]);
279  boolean c = p.isAnagram (args[0], args[1]);
280  boolean b = p.areMutualPalindromes (args[0], args[1]);
281  System.out.println ( "\"" + args[0] + "\"" + " and " + "\"" + args[1] + "\"" + String.format(" are%s anagrams", a?"":" not") );
282  System.out.println ( "\"" + args[0] + "\"" + " and " + "\"" + args[1] + "\"" + String.format(" are%s anagrams", c?"":" not") );
283  System.out.println ( "\"" + args[0] + "\"" + " and " + "\"" + args[1] + "\"" + String.format(" are%s mutual palindromes", b?"":" not") );
284  } else p.printPalindromeNumbers (10000,20); // no arguments
285  }
286 }
palindromes
Class for checking whether strings are palindromes or anagrams.
Definition: palindromes.java:72
baseConverter
Class for converting between different numerical bases.
Definition: baseConverter.java:64
palindromes.reverse
static String reverse(String s)
Reverses a given String.
Definition: palindromes.java:100
palindromes.printPalindromeNumbers
static void printPalindromeNumbers(int start, int amount)
Prints the first palindrome numbers beginning at a given point.
Definition: palindromes.java:252
palindromes.isPalindrome
static boolean isPalindrome(String s)
Checks whether a word is a palindrome.
Definition: palindromes.java:84
palindromes.reverseWords
static String reverseWords(String s)
Reverses each word in a phrase.
Definition: palindromes.java:123
palindromes.main
static void main(String[] args)
main function for testing.
Definition: palindromes.java:266
palindromes.removeSpacesAndPonctuation
static String removeSpacesAndPonctuation(String s)
Removes spaces and punctuation from a String.
Definition: palindromes.java:153
palindromes.deAccent
static String deAccent(String str)
Removes diacritical marks, aka accents.
Definition: palindromes.java:141
palindromes.areAnagrams
static boolean areAnagrams(String s1, String s2)
Checks whether two strings form an anagram.
Definition: palindromes.java:176
palindromes.revString
static String revString(String str)
Recursive version.
Definition: palindromes.java:111
palindromes.isAnagram
static boolean isAnagram(String a, String b)
Definition: palindromes.java:188
baseConverter.itoa
static String itoa(int num, int base)
Converts an integer value to a string using the specified base and returns it.
Definition: baseConverter.java:299
palindromes.areMutualPalindromes
static boolean areMutualPalindromes(String s1, String s2)
Checks whether two strings are mutual palindromes.
Definition: palindromes.java:226
palindromes.isPhrasePalindrome
static boolean isPhrasePalindrome(String s)
Checks whether a phrase is a palindrome.
Definition: palindromes.java:241