2012-03-27 33 views
5

Tôi có nhiều tập hợp url và tôi muốn triển khai tự động hoàn thành. Tôi không thích sự phức tạp của cách tiếp cận ngây thơ vì nó là tuyến tính với kích thước thiết lập:Cách tạo chỉ mục tiền tố đơn giản trong Java?

for(String url: urls) if(url.startsWith(input) {doSomething();} 

Bây giờ tôi biết rằng trong một Hash Set, chức năng "chứa()" công trình "O (1) "nhưng không có" containsPrefix() ". Có cách nào đơn giản mà không cần sử dụng một thư viện lớn như Lucene hay tự viết mã? Tôi sẽ không có vấn đề gì nhưng nó có vẻ quá mức cần thiết cho một vấn đề đơn giản như vậy vì vậy tôi muốn biết nếu có một giải pháp đơn giản :-)

Từ các lớp khoa học máy tính của tôi Tôi nhớ một cây bao gồm các đoạn chuỗi Tôi quên nó được gọi như thế nào. Nó hoạt động như sau:

[car, care, carrot,carrotville]-> 

car 
| 
-/ 
-e 
-rrot 
    | 
    ----ville 

P .: Làm cách nào để gọi các phương thức trả về tất cả các chuỗi mà một chuỗi là tiền tố? Giống như tiền tố a là b, b là gì?

+0

bạn muốn làm gì? tự động thêm một số văn bản vào đầu mỗi chuỗi? –

+0

Tôi muốn biết chuỗi của tôi là tiền tố để tôi có thể cung cấp cho họ như là các đề xuất tự động hoàn thành. –

Trả lời

2

Nếu bạn cần phải tìm một cách hiệu quả các tiền tố của chuỗi, sử dụng một Trie, một cấu trúc dữ liệu được thiết kế một cách chính xác cho mục đích đó:

Một Trie, hoặc cây tiền tố, là một cây cấu trúc dữ liệu ra lệnh được sử dụng để lưu trữ một mảng kết hợp trong đó các khóa thường là các chuỗi. Không giống như cây tìm kiếm nhị phân, không có nút nào trong cây lưu trữ khóa được kết hợp với nút đó; thay vào đó, vị trí của nó trong cây xác định khóa mà nó được liên kết. Tất cả các hậu duệ của một node có một tiền tố chung của chuỗi kết hợp với nút đó, và gốc được kết hợp với chuỗi rỗng

Hai liên kết với sampleimplementations.

+1

Hoàn hảo! Tôi đã sử dụng một từ https://forums.oracle.com/forums/thread.jspa?messageID=8787521 và nó đã làm việc trong lần thử đầu tiên! –

1

thời gian dài trước đây, tôi đặt một thi Trie đơn giản ở đây:

http://code.google.com/p/triebag/source/browse/trunk/src/triebag/tries/SimpleTrie.java

Tuy nhiên đây không phải là một Trie nhỏ gọn, vì vậy nó tạo ra một nút cho mỗi ký tự, tạo một nhỏ gọn là một chút phức tạp hơn.

+0

Điều này thật tuyệt! Tôi không quan tâm nếu đó là một nút cho mỗi nhân vật nhưng tôi sẽ để lại câu hỏi mở chỉ trong trường hợp ai đó có một với bội số. –

+0

Np, phiên bản nhỏ gọn sử dụng khoảng 50% ít nút hơn (ít nhất là từ Thổ Nhĩ Kỳ trong từ điển) Đây là mã kiểm tra, vì vậy bạn có thể thấy nó hoạt động, tôi hy vọng không có lỗi :) http://code.google.com/p/triebag/source/browse/trunk/test/triebag/tries/SimpleTrieTest.java – mdakin

+0

Tôi đã thử SimpleTrie của bạn nhưng nó dường như không hoạt động đối với tôi. Đầu tiên hàm tạo không được công khai và sau khi tôi thay đổi điều đó, kiểm thử sau không trả về: 'SimpleTrie trie = new SimpleTrie <>(); \t \t trie.add ("x", "x"); \t \t trie.add ("xy", "xy"); \t \t Iterator it = trie.getItemsWithPrefix ("x"); \t \t trong khi (it.hasNext()) System.out.println (it.next()); ' –

0

Các biểu thức chính quy thực hiện java.util.regex.Pattern có thể xử lý một cách hiệu quả các tiền tố:

StringBuilder buffer = new StringBuilder(); 
for (String prefix : prefixes) { 
    if (buffer.length() > 0) 
     buffer.append("|"); 
    buffer.append(prefix); 
} 
Pattern prefixPattern = Pattern.compile("^(" + buffer + ")"); 

Bạn có thể kiểm tra tất cả các tiền tố:

boolean containsPrefix = prefixPattern.matcher(stringToTest).find(); 

Lưu ý: để đơn giản, các chuỗi tiền tố không được thoát. Regexp ký tự [,], \, *,?, $, ^, (,), {,} Và | phải được tiền tố \.

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