2012-10-01 54 views
5

Tôi có một tệp chuỗi (lớn) trong ứng dụng của tôi chứa một chuỗi ký tự ngẫu nhiên [aZ] và [0-9] nhưng cũng ";", "/" , "?", ":" và "@". Tôi muốn ứng dụng của tôi cho tôi biết vị trí gần nhất có 6 chữ số được hiển thị liên tiếp (như "105487" hoặc "558463").Java - Cách tìm kiếm một chuỗi cho 6 số ngẫu nhiên

Cách tốt nhất để đạt được điều này là gì? Cảm ơn bạn đã xem xét điều này.

+0

Vui lòng làm rõ "vị trí gần nhất". Đây có phải là sự xuất hiện đầu tiên trong tệp không? –

+0

Vị trí có phải là số dòng và cột trong tệp không? –

+0

vâng, tôi có nghĩa là lần đầu tiên xảy ra. Vị trí chỉ có nghĩa là số mà hàm indexOf trong java sẽ cung cấp dưới dạng một số. – DVPeer

Trả lời

1

An cách tiếp cận hiệu quả là lặp lại các ký tự của chuỗi và kiểm tra xem mỗi ký tự có phải là chữ số hay không. Khi tìm thấy một trận đấu tiếp tục tìm kiếm phần còn lại của chuỗi. Một cái gì đó như

int nDigits=0, i = 0; 
CharacterIterator it = new StringCharacterIterator("very long string123456"); 
for (char ch=it.first(); ch != CharacterIterator.DONE; ch=it.next()) { 
    i++; 
    nDigits = (ch.isDigit() ? nDigits++ : 0); 
    if (nDigits == 5) { 
     // DONE. Position is "i" 
    } 
} 
+0

Cảm ơn bạn, tôi chắc chắn sẽ thử điều này. – DVPeer

3

Sử dụng Character.isDigit trong khi lặp lại các ký tự của chuỗi rồi đếm số lên cho đến khi bạn tìm thấy 6 số liên tiếp hoặc đặt lại số đó nếu chuỗi bị ngắt. Theo dõi chỉ số và bạn chỉ có thể tính toán vị trí gần nhất bằng cách trừ.

Điều này không hiệu quả lắm, nhưng tôi nghĩ rằng O (n) là đủ nếu các chuỗi không quá lớn. Để tối ưu hóa hãy xem những gì Luiggi Mendoza đã đề xuất trong các nhận xét.

+0

Cảm ơn câu trả lời của bạn. Tôi nghĩ rằng đây sẽ là giải pháp duy nhất, nhưng tôi đã hy vọng rằng java đã có một cách hiệu quả hơn để làm điều này. Tôi sẽ xem xét này. – DVPeer

+0

@ user1637234 bạn có thể sử dụng cụm từ thông dụng như Lablabla đã đăng. –

+2

Bạn có thể tối ưu hóa điều này: nếu bạn tìm thấy chữ số ở vị trí X, sau đó kiểm tra ký tự ở vị trí X + 5, nếu ký tự đó không phải là chữ số, sau đó bắt đầu tìm kiếm từ đây. Nếu đó là chữ số, sau đó quay lại (X + 4, X + 3 ...) cho đến khi bạn tìm thấy chữ số không và bắt đầu lại từ vị trí nhỏ nhất. –

4

Bạn có thể sử dụng regex.

String regex = "(\\d{6})"; 
Pattern pattern = Pattern.compile(regex); 
Matcher matcher = pattern.matcher(YOU STRING HERE); 
// Check all occurrences 
while (matcher.find()) { 
    System.out.print("Start index: " + matcher.start()); 
    System.out.print(" End index: " + matcher.end()); 
    System.out.println(" Found: " + matcher.group()); 
} 

Điều này sẽ thực hiện công việc.

(Mẫu mã từ here)

+0

cho chuỗi rất lớn, nó có khả năng sẽ thất bại với OOME – jdevelop

+2

tại sao không sử dụng REGEX \\ d {6} thay thế? – gtgaxiola

+0

Vâng, tôi không biết chuỗi dài bao nhiêu, nhưng tôi nghĩ đó là một lựa chọn tốt. Cảm ơn bạn đã chỉ ra. –