我想知道逗号分隔的字符串是否只包含相同的值:
test,asd,123,test
test,test,test
这里第二个字符串只包含单词" test"。我想识别这些字符串。
由于我希望迭代超过100GB,因此性能非常重要。
如果字符串只重复包含一个值,那么这可能是确定boolean
结果的最快方法?
public static boolean stringHasOneValue(String string) {
String value = null;
for (split : string.split(",")) {
if (value == null) {
value = split;
} else {
if (!value.equals(split)) return false;
}
}
return true;
}
答案 0 :(得分:12)
根本不需要拆分字符串,实际上不需要任何字符串操作。
indexOf
逗号)。length-1 % (foundLength+1)==0
)bob,bob,bob
匹配bob,bobabob
不匹配)。示例循环,您需要调整startPos
的确切位置以指向第一个逗号后面的第一个字符:
for (int i=startPos;i<str.length();i++) {
if (str.charAt(i) != str.charAt(i-startPos)) {
return false;
}
}
return true;
考虑到传入数据的格式,你不可能比这快得多,但你可以通过单线性扫描完成。长度检查将立即消除许多不匹配的情况,因此是一个简单的优化。
答案 1 :(得分:1)
调用split
可能会很昂贵 - 特别是如果它是200 GB的数据。
考虑下面的内容(未经过测试,可能需要对索引值进行一些调整,但我认为你会得到这个想法) -
public static boolean stringHasOneValue(String string) {
String seperator = ",";
int firstSeparator = string.indexOf(seperator); //index of the first separator i.e. the comma
String firstValue = string.substring(0, firstSeparator); // first value of the comma separated string
int lengthOfIncrement = firstValue.length() + 1; // the string plus one to accommodate for the comma
for (int i = 0 ; i < string.length(); i += lengthOfIncrement) {
String currentValue = string.substring(i, firstValue.length());
if (!firstValue.equals(currentValue)) {
return false;
}
}
return true;
}
复杂性O(n) - 假设substring
的Java实现是有效的。如果不是 - 您可以编写自己的substring
方法,该方法从字符串中获取所需的字符数。
答案 2 :(得分:0)
一个破解只是一个行代码:
(@Tim回答更有效率)
System.out.println((new HashSet<String>(Arrays.asList("test,test,test".split(","))).size()==1));