如何用case来判断字符串?

月光 2012-08-29 12:07:30
有这样的一个对应关系
EGY 埃及 CHN 中国
IRL 爱尔兰 TWN 中国台湾
AUS 澳大利亚 GBR 英国
BRA 巴西 ESP 西班牙
POL 波兰 HKG 香港
DNK 丹麦 SGP 新加坡
RUS 俄罗斯 JPN 日本
PHL 菲律宾 THA 泰国
CUB 古巴 USA 美国
NLD 荷兰 NGA 尼日利亚
ROM 罗马尼亚 KOR 韩国
MYS 马来西亚 CAN 加拿大
MEX 墨西哥 FRA 法国
CHE 瑞士 PRK 朝鲜
NZL 新西兰 DEU 德国
ITA 意大利 MAC 澳门
AFG 阿富汗 AGR 阿根廷

函数输入国别代码(比如CHN),返回中文(比如中国),现在我只会用if then,想看看还有没有高手更简单方便的办法
...全文
797 40 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
xtfnpgy 2013-07-17
  • 打赏
  • 举报
回复
//声明: private function GetCountryName(str_countryCode:string):string; //实现: function TForm1.GetCountryName(str_countryCode:string):string; var str_value : string; strlst : Tstringlist; begin strlst := TStringList.Create; strlst.CommaText :='EGY, CHN, IRL, TWN。。。。';//后面省略 case strlst.IndexOf(str_countryCode) of 0: Result:= '埃及'; 1: Result:= '中国'; 2: Result:= '爱尔兰'; 3: Result:= '台湾'; //后面省略 end; strlst.Free; end; //调用 procedure TForm1.btn1Click(Sender: TObject); var str_value : string; begin str_value := GetCountryName('CHN'); ShowMessage(str_value); end;
lm_whales 2013-07-17
  • 打赏
  • 举报
回复
26*26*26 =17576 建个表也不大
虎子8 2013-06-18
  • 打赏
  • 举报
回复
总结一句就是 case只能用来判断整形,如果你想判断不相同的string,其实就是想办法把string转化为特定的,不重复的integer. 那这个方法就多了,直接把国家首字母简写定义成整形常量是最简单好用的 const EGY=0 ; CHN=1; ...
酣酣 2013-06-18
  • 打赏
  • 举报
回复
别Case了,还是TStringList吧! 更方便一点儿!
lm_whales 2013-06-17
  • 打赏
  • 举报
回复
EGY 用三个三个字母生成索引,(直接把三个字母变成整数),作为索引见一个表,按索引填表,或者用hash 然后用三个字母生成索引,查表表即可。
sanguomi 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 的回复:]

弄棵树。
[/Quote]

跟上面说用哈希的一样, 杀鸡用牛刀的感觉
lhy 2012-08-30
  • 打赏
  • 举报
回复
弄棵树。
hsfzxjy 2012-08-30
  • 打赏
  • 举报
回复
楼主用中文名,我都无法进入你的空间,浏览器无法解析URL。。。
hsfzxjy 2012-08-30
  • 打赏
  • 举报
回复
楼主用中文名,我都无法进入你的空间,浏览器无法解析URL。。。
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 的回复:]

引用 30 楼 的回复:
使用RTTI反向查找是这样的,但是枚举类型可以直接指定元素值,不必默认的0、1、2、3... 和字符串代码之间还是可以做到直接映射,稍微麻烦一点而已。
这样处理的效果与"const CHN = $004E4843"是完全一样的。
[/Quote]

实现的功能是一样的,但是可以直接定位串数组的下标,不需要case语句。
僵哥 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 的回复:]
使用RTTI反向查找是这样的,但是枚举类型可以直接指定元素值,不必默认的0、1、2、3... 和字符串代码之间还是可以做到直接映射,稍微麻烦一点而已。[/Quote]
这样处理的效果与"const CHN = $004E4843"是完全一样的。
wsxcdx 2012-08-30
  • 打赏
  • 举报
回复
不能用数据库吗?
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 的回复:]

引用 25 楼 的回复:

涉及到数据库开发的可以设立一个国家字典表,用select、locate都可以,而且增加、删除记录都不用修改程序,想进一步提高效率,可以在程序启动时候将表数据提取至二维动态数组里,用onkeydown等事件去匹配即可。

case 只支持有序类型,枚举不能超过256个,维护起来还需要修改程序。

当前全世界国际上认可的国家和地区有多少个?其实使用枚举只不过是好看一些,从字符串转换成枚举的消耗依然省不了。
[/Quote]

使用RTTI反向查找是这样的,但是枚举类型可以直接指定元素值,不必默认的0、1、2、3... 和字符串代码之间还是可以做到直接映射,稍微麻烦一点而已。

  • 打赏
  • 举报
回复
[Quote=引用 25 楼 的回复:]

涉及到数据库开发的可以设立一个国家字典表,用select、locate都可以,而且增加、删除记录都不用修改程序,想进一步提高效率,可以在程序启动时候将表数据提取至二维动态数组里,用onkeydown等事件去匹配即可。

case 只支持有序类型,枚举不能超过256个,维护起来还需要修改程序。
[/Quote]

集合类型的元素不能超过256个,枚举类型元素没有限制,编译器能根据元素数量多少自动选择byte、word、dword来存储枚举元素,也可以使用{$Z1}、{$Z2}、{$Z4}或者{$MINENUMSIZE 1}、{$MINENUMSIZE 2}、{$MINENUMSIZE 4}编译开关来手工指定(即便你指定了{$MINENUMSIZE 1},如果枚举类型的元素超过256个,编译起还是自动将其提升为word元素大小)。
僵哥 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 的回复:]

涉及到数据库开发的可以设立一个国家字典表,用select、locate都可以,而且增加、删除记录都不用修改程序,想进一步提高效率,可以在程序启动时候将表数据提取至二维动态数组里,用onkeydown等事件去匹配即可。

case 只支持有序类型,枚举不能超过256个,维护起来还需要修改程序。
[/Quote]
当前全世界国际上认可的国家和地区有多少个?其实使用枚举只不过是好看一些,从字符串转换成枚举的消耗依然省不了。
僵哥 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

找到了一个相关的网页

自做Delphi的HashTable,用于管理键值对
http://blog.sina.com.cn/s/blog_59cb8a930100bvt7.html
[/Quote]
HashTable可以有良好的扩展,但是在适用你这个非常明确的需求时,计算Hash和Hash内值的匹配(Hash值会重复)也需要一个不小的消耗,甚至都有可能比不上if条件,因为在Hash里面找到了之后仍然需要if条件,只是省了代码量,看起来比较好看。
fox600123 2012-08-29
  • 打赏
  • 举报
回复
涉及到数据库开发的可以设立一个国家字典表,用select、locate都可以,而且增加、删除记录都不用修改程序,想进一步提高效率,可以在程序启动时候将表数据提取至二维动态数组里,用onkeydown等事件去匹配即可。

case 只支持有序类型,枚举不能超过256个,维护起来还需要修改程序。

userisexists 2012-08-29
  • 打赏
  • 举报
回复
uses TypInfo;
userisexists 2012-08-29
  • 打赏
  • 举报
回复
type
TCountry = (EGY, CHN);
const
SCountrys: array [TCountry] of string = (
'埃及', '中国');

function ToCountry(const code: string): string;
var
v: TCountry;
begin
v := TCountry(GetEnumValue(TypeInfo(TCountry), code));
if v in [EGY..CHN] then
result := SCountrys[v]
else
result := 'ERROR';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := ToCountry(Edit1.text);
end;
sanguomi 2012-08-29
  • 打赏
  • 举报
回复
如果数据量不大都没必要用HASH
数据小的话用两个一维数组就行了
加载更多回复(20)

16,747

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧