001 /* 002 NGramJ - n-gram based text classification 003 Copyright (C) 2001 Frank S. Nestel (frank at spieleck.de) 004 005 This program is free software; you can redistribute it and/or modify 006 it under the terms of the GNU Lesser General Public License as published 007 by the Free Software Foundation; either version 2.1 of the License, or 008 (at your option) any later version. 009 010 This program is distributed in the hope that it will be useful, 011 but WITHOUT ANY WARRANTY; without even the implied warranty of 012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 013 GNU General Public License for more details. 014 015 You should have received a copy of the GNU Lesser General Public License 016 along with this program (lesser.txt); if not, write to the Free Software 017 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 018 */ 019 020 package de.spieleck.app.ngramj.phoner; 021 022 import java.util.Hashtable; 023 024 /** 025 * Efficient enumeration of PhoneNumberWords to a certain Number 026 */ 027 public class PhonerEnum 028 extends PhoneKeys 029 { 030 protected int i, length; 031 protected byte[][] sets; 032 protected byte[] res; 033 protected int[] j; 034 035 public PhonerEnum(String pnumber) 036 throws IllegalArgumentException 037 { 038 length = pnumber.length(); 039 sets = new byte[length][]; 040 for (i = 0; i < length; i++) 041 { 042 String ch = String.valueOf(pnumber.charAt(i)); 043 sets[i] = (byte[])replacers.get(ch); 044 // Non existing characters are taken verbatim 045 if ( sets[i] == null ) 046 sets[i] = new byte[] { ch.getBytes()[0] }; 047 } 048 res = new byte[length]; 049 j = new int[length]; 050 i = 1; 051 j[0] = -1; 052 } 053 054 public byte[] next() 055 { 056 i--; 057 while ( i >= 0 ) 058 { 059 j[i]++; 060 if ( j[i] >= sets[i].length ) 061 i--; 062 else 063 { 064 res[i] = sets[i][j[i]]; 065 i++; 066 if ( i == length ) 067 { 068 return res; 069 } 070 else 071 { 072 j[i] = -1; 073 } 074 } 075 } 076 return null; 077 } 078 } 079