2013-06-07 30 views
5

Tôi mới sử dụng Java, vì vậy tôi không chắc chắn lựa chọn cấu trúc dữ liệu nào sẽ tốt ở đây. Tôi sẽ lưu trữ dữ liệu gia tốc kế, con quay hồi chuyển và từ kế (9 giá trị) trong một danh sách, được sử dụng sau này để làm mịn, hiển thị và xử lý tín hiệu.Cấu trúc dữ liệu nào là hợp lý đối với dữ liệu chuỗi thời gian trong Java?

Ý tưởng của tôi là tạo một đối tượng MyObject có mười thành viên: dấu thời gian và chín giá trị định hướng/chuyển động, tất cả chúng đều nổi. Sau đó, tôi sẽ lưu trữ dữ liệu trong một ArrayList<MyObject>. Đó là một ý tưởng hay hoặc tôi đã bỏ qua một cái gì đó?

Danh sách sẽ chứa tối đa 100k giá trị.

+0

Có khả năng truy cập đồng thời không? – fge

+0

@fge Không, mọi thứ sẽ chạy trong một chuỗi duy nhất. – Andreas

+0

Vậy thì một ArrayList là tốt.Nhưng các giá trị 100k khá lớn, bạn có viết những thứ này để lưu trữ liên tục trước khi xử lý hoặc bạn xử lý chúng trong khi đang chạy không? – fge

Trả lời

1

Sử dụng TreeMap để bắt đầu cải thiện hiệu suất tra cứu.

TreeMap

Note (trong tài liệu):

thực hiện này cung cấp đảm bảo log (n) Chi phí thời gian cho các containsKey, có được, đặt và gỡ bỏ các hoạt động.

+5

Nếu chuỗi dữ liệu được lưu trữ theo thứ tự, một 'ArrayList' là nhanh hơn ... – fge

+0

@fge Đối với n = 100k, n so với log (n), log (n) = 5 và n = 100 000. Nếu tôi đang tìm kiếm cho một mục cụ thể và nó đã xảy ra là mục cuối cùng tôi sẽ phải tìm kiếm thông qua 100 000 mục để phù hợp với mục cuối cùng. Có lẽ một Hashmap của các thuộc tính có thể tạo ra một chỉ mục vào ArrayList để cung cấp truy cập chỉ mục mảng 1 bước. Bạn không chắc chắn cách danh sách mảng được sắp xếp có thể cung cấp quyền truy cập nhanh hơn nếu bạn không biết chỉ mục cho mục bạn đang tìm kiếm? – Excalibur2000

+0

Đọc nhận xét: anh ấy _không phải truy cập dữ liệu_ trong chương trình của anh ấy, chỉ lưu trữ nó, xử lý được thực hiện sau. Vì vậy, anh ta cần cấu trúc dữ liệu "chỉ chèn nhanh". 'TreeMap' là quá mức cần thiết cho điều đó. – fge

0

Tạo lớp học của riêng bạn là đúng cách để đi. Bây giờ để lưu trữ các đối tượng của lớp đó ...

Nếu bạn cần tra cứu trực tiếp (ví dụ: "cho tôi đối tượng thứ 5") trên các đối tượng khi bạn có tất cả, hãy sử dụng ArrayList. Nhưng nếu bạn sẽ chỉ lặp lại tất cả các đối tượng theo thứ tự, bạn nên cân nhắc sử dụng một linked list.

Lớp ArrayList sử dụng mảng nguyên thủy mà nó sẽ phát triển khi cần để chứa các phần tử bạn thêm vào. Khi nó phát triển cấu trúc nội bộ của nó, nó cần phải phân bổ một mảng mới và sao chép trên tất cả các giá trị ban đầu. Điều này có thể tốn kém (đặc biệt là với các yếu tố 100K!). Bạn có thể cung cấp cho nó kích thước ban đầu để có thêm thời gian trước khi cần phát triển; nhưng nếu bạn không cần nhiều không gian, mảng nội bộ của ArrayList có thể lãng phí một lượng lớn bộ nhớ.

Việc thêm các phần tử vào danh sách được liên kết sẽ không mất nhiều chi phí vì không cần "phát triển"; nó chỉ thêm một nút khác vào danh sách. Nhưng bạn không thể tìm kiếm các mục theo chỉ mục của chúng. Bạn sẽ phải bắt đầu ở phần tử đầu tiên và lặp qua danh sách tới phần tử bạn muốn.

0

Bạn có thể muốn xem xét sử dụng một dòng đầu ra tập tin đầu ra dữ liệu trực tiếp, chứ không phải lưu trữ nó trong một số cấu trúc dữ liệu:

output = new BufferedWriter(new FileWriter("output.csv")); 

while(dataSource.stillHasData()) 
    output.println(dataSource.getData().toString()); 

output.close(); 

Sử dụng một BufferedWriter đảm bảo rằng chương trình không nhất thiết phải chờ đợi đĩa ghi để xảy ra trước khi nó có thể lấy dữ liệu tiếp theo, do đó, điều này sẽ được chấp nhận để thu thập dữ liệu trực tiếp (thường).

Sau đó, bạn nên làm một cái gì đó như thế này trong lớp dữ liệu của bạn:

public String toString(){ 
    StringBuilder buf = new StringBuilder(); 

    buf.append(timeStamp); str.append(','); 
    // ... 
    // append all the other data 

    return buf.toString(); 
} 

Bằng cách này để làm việc đó có lợi thế mà sau đó bạn có thể nhập nó vào chương trình như excel hoặc thực sự chỉ là về bất kỳ chương trình mà bạn sẽ sử dụng để xử lý dữ liệu.

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