/*
 * SearchTest.java  1.0
 * 
 * Copyright (c) 1999 Emmanuel PUYBARET - eTeks. All Rights Reserved.
 *
 */

import java.text.Collator;
import java.util.Locale;

public class SearchTest 
{
  public static void main (String args [])
  {
    String search = "TEXT";
    // Fabrication d'un tres long texte
    String text  = "Un ";
    for (int i = 0; i < 1000; i++)
      text += "tr\u00e8s ";      
    text += "long t\u00e8xte";
    
    long time = System.currentTimeMillis ();
    // Instantiation d'un collator francais
    Collator compareOperator = Collator.getInstance (Locale.FRENCH);    
    compareOperator.setStrength (Collator.PRIMARY);

    // Recherche de la sous-chaine search dans text
    int searchLength = search.length ();
    int max = text.length () - searchLength;
    int index = -1;
    for (int i = 0; i < max; i++)
      if (compareOperator.compare (text.substring (i, searchLength++), search) == 0)
      {
        index = i;
        break; 
      }
    // Affichage du temps ecoule
    System.out.println ("Trouv\u00e9 avec Collator \u00e0 l'indice "
                        + index + " apr\u00e8s " 
                        + (System.currentTimeMillis () - time) + " ms"); 


    time = System.currentTimeMillis ();
    // Conversion des deux chaines en minuscules sans accents 
    // avec le convertisseur ci-dessous
    String lowerCaseText   = toLowerCase (text);
    String lowerCaseSearch = toLowerCase (search);

    // Recherche de la sous-chaine lowerCaseSearch dans lowerCaseText
    index = lowerCaseText.indexOf (lowerCaseSearch);
    // Affichage du temps ecoule
    System.out.println ("Trouv\u00e9 avec toLowerCase () et indexOf \u00e0 l'indice "
                        + index + " apr\u00e8s "  
                        + (System.currentTimeMillis () - time) + " ms"); 
  }
    
  // Conversion des caracteres d'une chaine en minuscules sans accents
  static public String toLowerCase (String string)
  {
    char [] charsData = new char [string.length ()];
    string.getChars (0, charsData.length, charsData, 0);
    
    char c;
    for (int i = 0; i < charsData.length; i++) 
      if (   (c = charsData [i]) >= 'A'
          && c <= 'Z')
        charsData [i] = (char)(c - 'A' + 'a');
      else
        switch (c)
        {
          case '\u00e0' :
          case '\u00e2' :
          case '\u00e4' : charsData [i] = 'a';
                          break;
          case '\u00e7' : charsData [i] = 'c';
                          break;
          case '\u00e8' :
          case '\u00e9' :
          case '\u00ea' :
          case '\u00eb' : charsData [i] = 'e';
                          break;
          case '\u00ee' :
          case '\u00ef' : charsData [i] = 'i';
                          break;
          case '\u00f4' :
          case '\u00f6' : charsData [i] = 'o';
                          break;
          case '\u00f9' :
          case '\u00fb' :
          case '\u00fc' : charsData [i] = 'u';
                          break;
        }

    return new String (charsData);
  }
}