如何在字符串中查找重复项?

时间:2015-11-11 16:02:15

标签: java string

我想知道逗号分隔的字符串是否只包含相同的值:

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

3 个答案:

答案 0 :(得分:12)

根本不需要拆分字符串,实际上不需要任何字符串操作。

  • 找到第一个单词(indexOf逗号)。
  • 检查剩余的字符串长度是该字的精确倍数+分隔逗号。 (即length-1 % (foundLength+1)==0
  • 循环遍历字符串的其余部分,检查找到的字符串的每个部分。只需将两个索引保存在同一个字符串中,然后将它们移动到它中。请务必检查逗号(即bob,bob,bob匹配bob,bobabob不匹配)。
  • 正如assylias所指出的那样,没有必要重置指针,只需让它们穿过String并将1st与2nd,2nd与3rd进行比较等。

示例循环,您需要调整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));