Delphi - 有没有更好的方法从州名获得州名缩写

时间:2010-04-28 22:12:11

标签: delphi delphi-2009 delphi-2010


const
states : array [0..49,0..1] of string =
(
('Alabama','AL'),
('Montana','MT'),
('Alaska','AK'),
('Nebraska','NE'),
('Arizona','AZ'),
('Nevada','NV'),
('Arkansas','AR'),
('New Hampshire','NH'),
('California','CA'),
('New Jersey','NJ'),
('Colorado','CO'),
('New Mexico','NM'),
('Connecticut','CT'),
('New York','NY'),
('Delaware','DE'),
('North Carolina','NC'),
('Florida','FL'),
('North Dakota','ND'),
('Georgia','GA'),
('Ohio','OH'),
('Hawaii','HI'),
('Oklahoma','OK'),
('Idaho','ID'),
('Oregon','OR'),
('Illinois','IL'),
('Pennsylvania','PA'),
('Indiana','IN'),
('Rhode Island','RI'),
('Iowa','IA'),
('South Carolin','SC'),
('Kansas','KS'),
('South Dakota','SD'),
('Kentucky','KY'),
('Tennessee','TN'),
('Louisiana','LA'),
('Texas','TX'),
('Maine','ME'),
('Utah','UT'),
('Maryland','MD'),
('Vermont','VT'),
('Massachusetts','MA'),
('Virginia','VA'),
('Michigan','MI'),
('Washington','WA'),
('Minnesota','MN'),
('West Virginia','WV'),
('Mississippi','MS'),
('Wisconsin','WI'),
('Missouri','MO'),
('Wyoming','WY')
);
function getabb(state:string):string;
var
  I:integer;
begin
  for I := 0 to length(states) -1 do
  if lowercase(state) = lowercase(states[I,0]) then
  begin
    result:= states[I,1];
  end;
end;
function getstate(state:string):string;
var
  I:integer;
begin
  for I := 0 to length(states) -1 do
  if lowercase(state) = lowercase(states[I,1]) then
  begin
    result:= states[I,0];
  end;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
 edit1.Text:=getabb(edit1.Text);
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
 edit1.Text:=getstate(edit1.Text);
end;

end.

有更好的方法吗?

4 个答案:

答案 0 :(得分:8)

这类数据是否应该硬编码? 使用像XML文件甚至只是CSV的东西不是更好。

或名称值对,即IA =爱荷华州 然后加载到TStringList中获取

States.Values['IA'] = 'Iowa';

然后你只需要写一些东西来搜索值,以便向后工作,如

//***Untested***
//Use: NameOfValue(States, 'Iowa') = 'IA'

function NameOfValue(const strings: TStrings; const Value: string): string;
var
  i : integer;
  P: Integer;
  S: string;
begin
  for i := 0 to strings.count - 1 do
  begin
    S := strings.ValueFromIndex[i];
    P := AnsiPos(strings.NameValueSeparator, S);
    if (P <> 0) and (AnsiCompareText(Copy(S, 1, P - 1), Value) = 0) then
     begin
      Result := strings.Names[i];
      Exit;
     end;
  end;
  Result := '';
end;

我也很确定它不区分大小写

答案 1 :(得分:7)

如果您使用的是D2009或D2010,请使用Generics.Collections中的TDictionary<string, string>。像你拥有它一样声明常量数组,然后通过将每一对放入字典来设置你的字典。然后只需使用字典的默认属性进行查找。

答案 2 :(得分:2)

请注意,小写(a)=小写(b)比sameText(a,b)慢。

此外,您可以通过将数组中的字符串仅存储为小写来进一步加快过程,然后在查找例程中将输入转换为小写。然后你可以使用更快的函数sameStr(a,b)。但是当然,当找到匹配时,您需要通过大写首字母来格式化它。对于如此小的字符串列表,这种加速方法可能不是很重要。毕竟,美国没有太多州。

此外,您应该使用const参数声明函数,即写

function getabb(const state:string):string;

而不是

function getabb(state:string):string;

(除非您想在例程中更改状态)。

最后,您可以通过省略begin循环的endfor来使代码更加紧凑和可读。

答案 3 :(得分:1)

我会将您的列表排序。这样,您可以使用binary search缩短查找时间。这一切都取决于你将要运用的迭代次数。大约50个项目看起来并不多,直到你在列表上迭代几千次寻找列表中的最后一项。

如果您知道列表的其余部分不匹配,您应该在获得匹配后立即从您的循环中保释。

阵列很好,根据您使用数据的方式,您可能需要添加一些也有abbreviations(PR = PUERTO RICO,GU = GUAM等)的“地区”。 / p>