2010-07-28 35 views
8

Chúng tôi có một đầu vào chuỗi và các kết hợp sau đây có giá trị (sunday ví dụ, *sunday*, sun*day*, *sun*day, su*nda*y) Nếu nó chỉ chứa một dấu hoa thị đơn, sau đó nó là một đầu vào xấu.Làm cách nào để kiểm tra xem chuỗi có chứa hai ký tự dấu hoa thị không?

Vì vậy, với đầu vào ở trên, làm cách nào để kiểm tra xem chuỗi có chứa nhiều dấu hoa thị hay không.

+3

Ít nhất hai hoặc hai chính xác? –

+0

Nó phải chính xác hai – Achaius

Trả lời

4

Bạn có thể sử dụng String.matches với một biểu thức chính quy:

"^.*(?:\\*.*){2}$" 

Nếu bạn muốn đúng hai dấu hoa thị:

"^[^*]*(?:\\*[^*]*){2}$" 

Mặc dù cho nhiệm vụ này nó có thể đơn giản chỉ để lặp qua chuỗi và đếm các dấu sao.

+2

Có ai vui lòng giải thích cụm từ thông dụng này không? – ederollora

3

Ít nhất hai cách:

  • regex

    String regex = ".*\\*.*\\*.*"; 
    boolean valid = input.matches(regex); 
    
  • loop

    int asterisks = 0; 
    for (int i = 0; i < input.length(); i ++) { 
        if (input.charAt(i) == '*') { 
         asterisks++; 
        } 
    } 
    
+0

Bạn có thể loại bỏ '. *' Từ phía trước và cuối của regex và sử dụng 'find()' để thay thế. Điều đó thực sự có thể nhanh hơn một chút. –

9
int asterisk1 = input.indexOf('*'); 
boolean hasTowAsterisks = asterisk1 != -1 && input.indexOf('*', asterisk1+1) != -1; 

Chỉnh sửa: giải pháp này giả định rằng yêu cầu là "có ít nhất hai dấu hoa thị".

2
boolean hasTwoAsteriks(String str) { 
int i; 
if((i = str.indexOf("*")) != -1) { 
    if ((i = str.indexOf("*", i+1)) != -1) 
    return true; 
return false; 
}
3

Dưới đây là một lựa chọn không regex làm việc với bất kỳ chuỗi chữ:

public static boolean containsNoneOrTwo(String haystack, String needle) { 
    int index = haystack.indexOf(needle); 
    return (index == -1) || 
     haystack.indexOf(needle, index+1) == haystack.lastIndexOf(needle); 
} 

Về cơ bản các thuật toán là:

containsNoneOrTwo(haystack, needle) 
    = haystack contains no needle OR 
     haystack's second needle is also its last 
+1

Và để sửa đổi nó để kiểm tra * chính xác hai dấu *, chỉ cần thay đổi dòng thứ ba thành 'return (index! = -1) &&'. –

0

Đối đầy đủ (mặc dù vài câu trả lời tốt đã được cung cấp, Tôi thích nhất của Mark và Joachim), dưới đây là hai phiên bản dựa trên String.split(regex)String.split(regex, limit):

sửa chữa

(Chỉnh sửa, lỗi :)

boolean containsAtLeastTwoAsterisks = ("_" + myString + "_").split("\\*", 3).length == 3; 

boolean containsExactlyTwoAsterisks = ("_" + myString + "_").split("\\*").length == 3; 

tôi đã viết a little benchmark dựa trên câu trả lời của chúng tôi (tôi biết, tiêu chuẩn không có nghĩa là nhiều, nhưng họ đang vui vẻ, và tôi có lẽ là tào lao, tôi biết .) Dù sao, đây là kết quả cho chạy mẫu:

********************************************************************************* 

Testing strings with one or less asterisk 

Processor: bhups 
Finished. Duration: 40 ms, errors: 0 

Processor: Bozho (loop version) 
Finished. Duration: 33 ms, errors: 0 

Processor: Bozho (regex version) 
Finished. Duration: 806 ms, errors: 0 

Processor: Joachim Sauer 
Finished. Duration: 24 ms, errors: 0 <-- winner 

Processor: Mark Byers 
Finished. Duration: 1068 ms, errors: 0 

Processor: seanizer 
Finished. Duration: 408 ms, errors: 0 

********************************************************************************* 

Testing strings with exactly two asterisks 

Processor: bhups 
Finished. Duration: 14 ms, errors: 0 <-- winner 

Processor: Bozho (loop version) 
Finished. Duration: 21 ms, errors: 0 

Processor: Bozho (regex version) 
Finished. Duration: 693 ms, errors: 0 

Processor: Joachim Sauer 
Finished. Duration: 14 ms, errors: 0 <-- winner 

Processor: Mark Byers 
Finished. Duration: 491 ms, errors: 0 

Processor: seanizer 
Finished. Duration: 340 ms, errors: 0 

********************************************************************************* 

Testing strings with more than two asterisks (not all processors will be included) 

Skipping processor bhups 

Processor: Bozho (loop version) 
Finished. Duration: 63 ms, errors: 0 <-- winner 

Skipping processor Bozho (regex version) 

Skipping processor Joachim Sauer 

Processor: Mark Byers 
Finished. Duration: 1555 ms, errors: 0 

Processor: seanizer 
Finished. Duration: 860 ms, errors: 0 

Có vẻ như không phải regex nhanh hơn rất nhiều so với regex. Đó là những gì bạn mong đợi, tôi đoán vậy.

CHỈNH SỬA: cố định người chiến thắng sai. xin lỗi, joachim

+0

Có 33 <24 không? ;-) –

+0

bạn nói đúng, tôi đã tự tìm thấy nó trước khi đọc nhận xét của bạn. sửa nó. –

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