Java 字符串函数如何计算字符串行中的分隔符

Java 字符串函数如何计算字符串行中的分隔符,java,string,Java,String,我有一行字符串,如下所示: A:B:C:D:E:F:G:H:I:J:K:L:M 这意味着分隔符(:)计数是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 delimi

我有一行字符串,如下所示:

A:B:C:D:E:F:G:H:I:J:K:L:M

这意味着分隔符(:)计数是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");
 }
我得到的输出在应该有效的地方是无效的。

应该有效

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");
 }

由于数组的值不是delimeter

的值,请使用以下方法计算特定
字符串

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;
}

没有理由在这里使用正则表达式。如果检查输入有效性的唯一标准是12个delimeters
,只需计算它们

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");
}
String strLine=“A:B:C:D:E:F:G:H:;
int预期的_DELIMETERS=12;
int delimiterCount=0;
for(int idx=0;idx
如果您想使用
拆分
,而且这确实是一种不错的方法(尽管它可能适用于这种特殊情况),您需要将-1作为第二个参数传递给
拆分
,否则它会删除空字符串

很高兴了解有关
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");
        }
    }
}

简明Java 8解决方案:

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

进行字符串替换,并将所有的
更改为空字符串-然后比较字符串长度-如果新字符串比原始字符串小12个字符,您就有了12个分隔符。@MarcB这在性能方面是如何叠加的?与计数出现次数相比,字符串替换是否会导致不必要的开销?取决于分隔符之间的数据量。对于较短的字符串,替换将更重,对于较长的字符串…可能需要进行基准测试。应将“fromIndex=index+1;”更改为“fromIndex=index+key.length;”,因为键字符串的长度可能大于1。(这只是在这种情况下才精确。)这将改善步长,因此性能几乎没有,逻辑上我认为这不会影响功能