2012-06-28 39 views
0

我有一個字符串行像以下計數定界符:字符串函數如何在串行

A:B:C:d:E:F:G:H:我:J-:K:L:M

這意味着分隔符(:)count是12。此行有效。

現在假設有一個下面的行:

A:B:C:d:E:F:G:H :::::

這條線也是有效的,因爲它包含12定界符。其中8個值存在,4個值爲空白。

下面的配置應該是無效的:

A:B:C:d:E:F: - 無效的 - 因爲它僅包含6個值,但預計在12

怎麼辦這個 .. ?我想下面的代碼,但沒有得到期望的輸出:

String strLine = "A:B:C:D:E:F:G:H:::::" ; 
int delimiterCount = 12 ; 

String[] ValuesArray = strLine.split(":"); 
if(ValuesArray.length != delimiterCounter){ 
System.out.println(Invalid); 
}else { 
System.out.println("ValidLine"); 
} 

我得到的輸出爲無效那裏,因爲它是前人的精力有效。

+0

做一個字符串替換和更改所有的':'爲空字符串 - 然後比較字符串長度 - 如果新的字符串12字體小於原始字體,你有12個分隔符。 –

+0

@MarcB這是如何在性能方面疊加起來的?與計算數字出現次數相比,字符串替換會導致不必要的開銷嗎? – cklab

+0

取決於分隔符之間有多少數據。對於短字符串,替換字符串會更長,字符串更長......可能需要進行基準測試。 –

回答

2

如果你想使用split,這是個不錯的辦法真的(雖然它可能是這種特定的情況),你需要傳遞-1作爲第二個參數split否則刪除空字符串。

請參閱http://ideone.com/gaUw5

很高興知道這個關於split。有些語言需要-1,有些則不需要。

代碼

class Main { 
    public static void main(String[] args) { 
     String line = "A:B:C:D:E:F:G:H:::::" ; 
     int delimiterCount = 12 ; 

     String[] values = line.split(":", -1); 
     if (values.length != delimiterCount + 1) { 
      System.out.println("Invalid Line"); 
     } else { 
      System.out.println("Valid Line"); 
     } 
    } 
} 
+0

謝謝雷.. :) :)它的作品:) :) – Beginner

0

應該

String strLine = "A:B:C:D:E:F:G:H: : : : : " ; 
int delimiterCount = 12 ; 

String[] ValuesArray = strLine.split(":"); 
if((ValuesArray.length - 1) != delimiterCounter){ 
System.out.println(Invalid); 
}else { 
System.out.println("ValidLine"); 
} 

爲數組將有價值觀不定界符

3

使用下面的方法來計算的特定String

public static int countOccurance(String inputString, String key) { 
    int index = 0; 
    int fromIndex = 0; 
    int result = 0; 

    if (inputString == null || key == null) { 
     return 0; 
    } 

    while ((index = inputString.indexOf(key, fromIndex)) != -1) { 
     result++; 
     fromIndex = index + key.length; 
    } 
    return result; 
} 
+0

應該改變「fromIndex = index + 1;」到「fromIndex = index + key.length;」因爲密鑰字符串可能長度大於1.(僅在這種情況下才是精確的。) – Thinhbk

+0

這將改善步長等性能很少,邏輯上我不認爲它會影響功能 –

0

沒有理由一次出現在這裏使用正則表達式。如果檢查輸入有效性的唯一標準是12個分位數:,只需對它們進行計數。

String strLine = "A:B:C:D:E:F:G:H:::::"; 
int EXPECTED_DELIMETERS = 12; 
int delimiterCount = 0; 
for (int idx = 0; idx < strLine.length(); idx++) { 
    if (strLine.charAt(idx) == ':') { 
     delimiterCount++; 
    } 
} 

if (EXPECTED_DELIMETERS == delimiterCount) { 
    System.out.println("ValidLine"); 
} else { 
    System.out.println("Invalid"); 
} 
0

簡明的Java 8解決方案:

private static boolean isValid(String content, char delimiter, int count) { 
    return count == content.chars().filter(c -> c == delimiter).count(); 
}