2010-04-28 41 views
5

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. 

Có cách nào để làm điều này không?Delphi - Có cách nào tốt hơn để lấy từ viết tắt của tiểu bang từ tên tiểu bang

+0

Bạn có lỗi đánh máy: "South Carolin" phải là "South Carolina" – dthorpe

+0

Cảm ơn! Tôi không thấy điều đó ... – Bill

+1

Làm thế nào để bạn đo lường "tốt hơn"? Nhanh hơn? Ngắn hơn? Có thể mở rộng? Có thẩm quyền? –

Trả lời

7

Nếu bạn đang sử dụng D2009 hoặc D2010, hãy sử dụng TDictionary<string, string> từ Generics.Collections. Khai báo mảng các hằng số như bạn có, sau đó thiết lập từ điển của bạn bằng cách đặt từng cặp vào từ điển. Sau đó, chỉ cần sử dụng thuộc tính mặc định của từ điển để thực hiện tra cứu của bạn.

+1

Tôi đề xuất hai từ điển, một cho mỗi chức năng. –

2

Lưu ý rằng chữ thường (a) = chữ thường (b) chậm hơn so với cùng một văn bản (a, b).

Ngoài ra, bạn có thể tăng tốc quy trình thêm bằng cách lưu trữ các chuỗi trong mảng dưới dạng chữ thường, và sau đó bắt đầu thường xuyên tìm kiếm bằng cách chuyển đổi đầu vào thành chữ thường. Sau đó, bạn có thể sử dụng hàm thậm chí nhanh hơn sameStr (a, b). Nhưng tất nhiên, khi một trận đấu được tìm thấy, bạn cần phải định dạng nó bằng cách viết hoa các chữ cái đầu tiên. Cách tiếp cận tăng tốc này có lẽ không quan trọng đối với một danh sách nhỏ các chuỗi. Xét cho cùng, không có quá nhiều tiểu bang ở Mỹ.

Ngoài ra, bạn nên khai báo các chức năng sử dụng đối số const, ví dụ: viết

function getabb(const state:string):string; 

thay vì

function getabb(state:string):string; 

(trừ khi bạn muốn thay đổi trạng thái trong các thói quen).

Cuối cùng, bạn có thể làm cho mã nhỏ gọn hơn và dễ đọc hơn bằng cách bỏ qua các số beginend của vòng for.

+1

Không có cách nào là nhanh nhất (và thật kỳ lạ khi bạn bắt đầu bằng cách nói đó là nhanh nhất, sau đó tiếp tục đề xuất tăng tốc). Một bảng băm sẽ nhanh hơn. Trong thực tế, hai bảng băm, một cho 'getabb' và một cho' getstate', tự động phát triển lúc khởi động cho đến khi không có xung đột, thậm chí còn nhanh hơn. Có thể vẫn còn nhanh hơn là một cấu trúc trie. Nhưng nếu bạn thực sự muốn tối đa nó ra, mã lên các con đường trie trực tiếp, cho phép bạn tối ưu hóa cho các trường hợp cạnh như '" Missouri "' và '" Mississippi "'. –

+0

@Marcelo: Về nguyên tắc có nghĩa là sửa đổi nhỏ có thể cần thiết, nhưng ý tưởng chính là OK. Nhưng bạn đúng, nó không phải là nhanh nhất anyway vì vậy tôi sẽ loại bỏ một phần không chính xác. Những giây đầu tiên khi tôi đọc câu hỏi tôi nghĩ rằng vấn đề chỉ đơn giản là để có được phần tử thứ N của một mảng, tức là bạn chèn một số và nhận một chuỗi. Và sau đó sẽ không có phương pháp nào nhanh hơn. Và bằng cách nào đó kết luận này vẫn còn trong tâm trí của tôi ngay cả sau khi tôi đã hiểu được vấn đề thực sự. –

8

Loại dữ liệu này có được mã hóa cứng không?
Sẽ không tốt hơn nếu bạn sử dụng một thứ gì đó như tệp XML hoặc thậm chí chỉ là CSV.

Hoặc Tên Value Pairs, tức là IA = Iowa
sau đó nạp vào một TStringList để có được

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

Sau đó, bạn chỉ cần phải viết một cái gì đó để tìm kiếm các giá trị để làm việc ngược như

//***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; 

Tôi khá chắc chắn trường hợp của nó không nhạy cảm quá

+2

+1; khi sử dụng TStringList với các cặp tên/giá trị là một giải pháp tốt. Tôi không hiểu tại sao bạn bị downvoted bởi những người khác (nó là khá thô lỗ để downvote mà không để lại một bình luận). –

+1

@Christopher Chase: Tại sao nó KHÔNG được mã hóa cứng? Tên và chữ viết tắt của các tiểu bang Hoa Kỳ đã được sửa chữa trong một thời gian ngắn và có lẽ sẽ không thay đổi trong tương lai gần. Bạn có đặt tên của riêng mình trong tệp XML hoặc CSV, cùng với tên viết tắt của bạn không? Nó không giống như một câu trả lời, mặc dù IMO không phải là một câu trả lời tốt, giống như việc thêm một RDBMS vào ứng dụng của bạn để lưu trữ tên và mật khẩu đăng nhập của một người dùng và duy nhất - phí không cần thiết, tệp I/O và mã. .) –

+1

@Ken White: với sự tôn trọng, tôi không đồng ý. Trộn mã và dữ liệu là icky. Ví dụ, lỗi chính tả cho 'South Carolina' đã được đề cập ở đây bởi dthorpe. Nếu điều đó có trong tệp thực thi, một tệp thực thi mới sẽ phải được gửi đi, trong khi lỗi có thể dễ dàng hơn nếu dữ liệu được lưu trữ ở một vị trí riêng biệt, chẳng hạn như cơ sở dữ liệu trung tâm. Việc triển khai một số lượng lớn các tệp thực thi tại các trang web với hàng trăm máy trạm không phải là một thứ được thực hiện một cách nhẹ nhàng. –

1

Tôi sẽ sắp xếp danh sách của bạn. Bằng cách đó, bạn có thể sử dụng binary search để giảm thời gian tra cứu xuống. Tất cả phụ thuộc vào số lần lặp mà bạn sẽ thực hiện. Khoảng 50 mặt hàng không có vẻ như nhiều, cho đến khi bạn lặp lại trong danh sách một vài nghìn lần tìm kiếm mục cuối cùng trong danh sách.

Ngoài ra, bạn nên luôn luôn nhận bảo lãnh từ các vòng của bạn ngay sau khi bạn nhận được một trận đấu nếu bạn biết phần còn lại của danh sách sẽ không phù hợp.

Mảng là tốt và tùy thuộc vào cách bạn sử dụng dữ liệu, bạn có thể cần phải thêm một số "lãnh thổ" cũng có abbreviations (PR = PUERTO RICO, GU = GUAM, v.v.).

Các vấn đề liên quan