首页 > 代码库 > 表驱动法1
表驱动法1
这算是对表驱动法的内容阅读之后的总结。
需求:
读取用户输入的一个字符,如果该字符是属于字母、数字、标点符号这三类,则输出对应的提示信息(您输入的是数字,您输入的是字母,您输入的是标点符号);如果,输入的
字符非上述三类中的一种,则提示,您输入的是未知字符。
不使用表驱动法:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | public class NormalWay { public boolean tellPunctuation( char c) { if (c == ‘.‘ || c == ‘,‘ || c == ‘?‘ || c == ‘!‘ || c == ‘;‘ ) { return true ; } else { return false ; } } public boolean tellAlphabet( char c) { if (( int ) c >= ‘a‘ && ( int ) c <= ‘z‘ ) { return true ; } if (( int ) c >= ‘A‘ && ( int ) c <= ‘Z‘ ) { return true ; } return false ; } public boolean tellDigit( char c) { if (( int ) c >= ‘0‘ && ( int ) c <= ‘9‘ ) { return true ; } else { return false ; } } public static void main(String[] args) { NormalWay one = new NormalWay(); if (args.length > 0) { char oneChar = args[0].charAt(0); if (one.tellDigit(oneChar)) { System. out .println( "Your input character is a digit." ); } else if (one.tellAlphabet(oneChar)) { System. out .println( "Your input character is a letter." ); } else if (one.tellPunctuation(oneChar)) { System. out .println( "Your input character is a punctuation." ); } else { System. out .println( "Your input character is unknown." ); } } } } |
缺点就是,当我要判断某种输入是属于哪些类型时,那么,我要写很多的逻辑判断。
使用表驱动法:
使用表驱动法的关键就是,输入的参数是一个Key,然后这个Key是与某个值关联的。至于如何关联,复杂的呢,则会输入该Key,然后经过简单的计算,得出值;
简单的呢,则是直接根据Key,不用计算,直接得到对应的值。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | public class SimpleTableDriven { private enum CharacterType { Digit, Letter, Punctuation, Unknown } private HashMap<Character, CharacterType> table = new HashMap<Character, CharacterType>(); private void initalElementRelationship( HashMap<Character, CharacterType> table) { table.put( ‘.‘ , CharacterType.Punctuation); table.put( ‘;‘ , CharacterType.Punctuation); table.put( ‘?‘ , CharacterType.Punctuation); table.put( ‘!‘ , CharacterType.Punctuation); table.put( ‘,‘ , CharacterType.Punctuation); for ( int i = 0 ; i < 26 ; i++) { int oneChar = ( int ) ‘a‘ + i; table.put(( char ) oneChar, CharacterType.Letter); } for ( int i = 0 ; i < 10 ; i++) { table.put(( char ) i, CharacterType.Digit); } } public CharacterType tellCharacterType( char c) { initalElementRelationship( this .table); if (!table.containsKey(c)) { return CharacterType.Unknown; } else { return table.get(c); } } public static void main(String[] args) { char oneChar = args[ 0 ].charAt( 0 ); SimpleTableDriven oneTable = new SimpleTableDriven(); if (CharacterType.Digit == oneTable.tellCharacterType(oneChar)) { System.out.println( "Your input character is a digit." ); } else if (CharacterType.Letter == oneTable.tellCharacterType(oneChar)) { System.out.println( "Your input character is a letter." ); } else if (CharacterType.Punctuation == oneTable .tellCharacterType(oneChar)) { System.out.println( "Your input character is a punctuation." ); } else if (CharacterType.Unknown == oneTable.tellCharacterType(oneChar)) { System.out.println( "Your input character is unknown." ); } else { System.out.println( "Error." ); } } } |
将确定输入字符的类型的过程,从通过逻辑判断来确定是什么类型,转变为通过查表的方式的方式来确定是什么类型。
好处是:
1.不用写一长串的逻辑判断。逻辑判断写得越多,就越容易出错。
2.要修改关系时,只需要在一个地方修改,在建立字符与类型的对应关系的地方修改,方便修改。
3.容易扩展
比如,我要将$也归为标点符号,那么,我只需要再添加一个关系便可table.put(‘$‘, CharacterType.Punctuation);而如果使用逻辑判断的话,那么我要在一长串的逻辑判断中,再添加一个逻辑判断。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。