2010-10-12 28 views
8

Khi tôi tiếp cận các sự cố Java, tôi sử dụng mẫu sưu tập. Tuy nhiên, thực hiện nó trong Delphi là một cơn ác mộng vì không có đối tượng Integer để xử lý mọi thứ.Cấu trúc dữ liệu Delphi nào có thể chứa danh sách các số nguyên duy nhất?

Tôi cần cấu trúc dữ liệu chứa số. Tôi muốn có thể thêm số, xóa số và kiểm tra nội dung của bộ sưu tập và mỗi số phải là duy nhất.

Tôi không quan tâm đến giải pháp mà tôi cần phải triển khai và tự mình kiểm tra lỗi. Có một đối tượng đã sẵn sàng như HashTable của Java không?

+6

bạn đang sử dụng phiên bản delphi nào? – RRUZ

+2

Nếu các số nằm trong khoảng từ 0 đến 255, hãy sử dụng "bộ byte". –

Trả lời

6

Tôi biết nó bẩn, nhưng bạn có thể lạm dụng TStringList (hoặc THashedStringList).

var 
    numberList: TStringList; 
begin 
    numberList := TStringList.Create; 
    numberList.Duplicates := dupIgnore; 
    numberList.Sorted := true; 
    numberList.add(IntToStr(1)); 
    numberList.add(IntToStr(2)); 
    numberList.add(IntToStr(3)); 
    numberList.add(IntToStr(1)); 
    // numberList.CommaText = '1,2,3' 
+0

tôi không muốn để có thể nhầm lẫn nó với các chuỗi khác. baah, tôi đoán nó sẽ làm. Bad Delphi. Chỉnh sửa: đã cho tôi ít thời gian hơn sau đó tôi mặc dù. CẢM ƠN!!! – none

+4

@không, triển khai TIntegerList tùy chỉnh của bạn sẽ chỉ mất vài phút. – splash

+3

Tôi sẽ chỉ sử dụng một TList thay vì một TStringList, đúc số nguyên để con trỏ. Nếu tôi đã có một phiên bản Delphi gần đây (> = 2009) tôi có thể sẽ sử dụng một TList . –

5

Lớp chứa Delphi trong thư viện VCL "chuẩn" kém. Đây là vấn đề lâu dài chỉ được sửa một phần trong các phiên bản mới nhất. Nếu bạn đang sử dụng Delphi> = 2009 bạn có lớp generics có thể xử lý các kiểu dữ liệu nguyên, trước khi bạn phải viết lớp của riêng bạn, hãy sử dụng TList theo cách không chuẩn hoặc sử dụng thư viện của bên thứ ba. Nếu bạn phải lưu số, nếu chúng dài tối đa 32 bit, bạn có thể lưu trữ chúng trong TList, truyền chúng đến và từ con trỏ. Bạn phải ghi đè lên phương thức Add() để đảm bảo tính duy nhất. Bạn cũng có thể sử dụng TB và đặt thành true "slot" tương ứng. Nếu không, bạn cần sử dụng các thư viện của bên thứ ba như ví dụ JCL (miễn phí) hoặc DIContainers (thương mại).

+1

Tôi xin lỗi, nhưng đó là "không có" để tôi truyền con trỏ dưới dạng số. nếu tôi từ bỏ sự an toàn của làm việc với ngôn ngữ mạnh mẽ loại tôi cũng có thể đi Lisp. nếu tôi vô tình thực hiện một cuộc gọi bộ nhớ với những con số này, cách trở lại từ mớ hỗn độn đó là soooo dài mà tôi thậm chí không muốn tưởng tượng nó. – none

+2

Bạn sẽ thực hiện cuộc gọi bộ nhớ với con trỏ của danh sách mà bạn không biết gì về? Bạn cần nhiều hơn chỉ là một ngôn ngữ gõ mạnh có vẻ như ... Anh ấy không nói về việc trộn các con trỏ và các số nguyên trong cùng một danh sách (điều đó sẽ là xấu). –

+1

đúng, tuy nhiên nếu bạn cảm thấy mệt mỏi thì bạn sẽ bị quấy rầy bởi những điều kỳ diệu mà mọi người đi đến, để làm cho cuộc sống của bạn trở thành địa ngục trong một hoặc hai ngày, chỉ cần làm cho họ không ngủ đủ giấc. "đây là bộ não của bạn trước ma túy, đây là bộ não của bạn sau khi bị lỗi. Bạn có muốn thử không?" hoặc một cách tốt hơn để nói "mã mã của bạn như thể một kẻ giết người hàng loạt sẽ xem xét mã của bạn, và anh ta biết bạn sống ở đâu." – none

20
uses GpLists; 

var 
    numberList: TGpIntegerList; 
begin 
    numberList := TGpIntegerList.Create; 
    numberList.Duplicates := dupIgnore; 
    numberList.Sorted := true; 
    numberList.add(1); 
    numberList.add(2); 
    numberList.add(3); 
    numberList.add(1); 

GpLists đi kèm với giấy phép BSD. Nó cũng chứa một lớp chứa các số nguyên 64 bit - TGpInt64List - và nhiều thứ khác.

+1

công việc tốt! Cần bao nhiêu phút để thực hiện? ;-) – splash

+0

cảm ơn các GPLists, bệnh nhìn vào nó. – none

1

Cá nhân, tôi khuyên bạn nên bắt đầu sử dụng DeCAL để lưu trữ dữ liệu. Nó có DMap container có thể xử lý hầu như bất kỳ loại dữ liệu nào, tự tối ưu hóa vì nó sử dụng cây Red-Black bên trong và nó sẽ không cho phép bạn thêm các bản sao (nếu bạn cần chèn bản sao, bạn có thể sử dụng DMultiMap). Một điều tuyệt vời nữa với DMap là việc tìm kiếm phần tử trong danh sách rất nhanh (nhanh hơn nhiều so với TStringList). Làm việc với DeCal có một chút khác biệt so với các thư viện Delphi khác nhưng một khi bạn cảm thấy thoải mái với nó, bạn sẽ không sử dụng bất kỳ StringList nào trong mã của bạn.

Chỉnh sửa: phiên bản cũ của DeCAL là trên SourceForge, nhưng tại đây bạn có thể tìm thấy hướng dẫn sử dụng pdf tuyệt vời.

1

Delphi có đơn vị mxarrays (Quyết định khối lập phương), có một lớp TIntArray, đặt thuộc tính của nó trùng lặp với dupIgnore. Nó cũng có thể sắp xếp các giá trị. Nếu bạn sẽ sử dụng nó, hãy xem Quality Central Report #:2703 để sửa lỗi trong đơn vị này.

7

Dictionary<Integer,Boolean> hoặc tương tự sẽ thực hiện.

+0

là từ điển một delphi 7 featuer trở lên? – none

+0

Trên Delphi 7; Delphi 2007 tôi nghĩ vậy. –

4

Bạn có thể sử dụng TList để lưu trữ tập hợp các số nguyên. Nó được cho là để lưu trữ con trỏ, nhưng kể từ khi con trỏ chỉ là số nguyên nó hoạt động hoàn hảo khi lưu trữ số nguyên.

3

Đây là một giải pháp đơn giản cho các phiên bản Delphi với Generics:

TUniqueList<T> = class(TList<T>) 
public 
    function Add(const Value: T): Integer; 
end; 

{ TUniqueList<T> } 

function TUniqueList<T>.Add(const Value: T): Integer; 
begin 
    if not Contains(Value) then 
    Result := inherited Add(Value); 
end; 

Và nếu hiệu suất với rất nhiều số nguyên là quan trọng thì bạn có thể giữ cho danh sách được sắp xếp và sử dụng serch nhị phân

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