如何在Java中找到字符串中常见的序列?
字符串是一长串数字,我想找到最常出现的数字序列。
答案 0 :(得分:2)
我想这取决于你正在寻找的序列有多长。
我要做的是使用Guava Multiset
,迭代序列,将所有子序列写入Multiset并按事件排序。这是一个示例实现:
public static String getMostFrequentSequence(final String input, final int patternLength) {
final Multiset<String> multiset = HashMultiset.create();
final int length = patternLength < 0 ? input.length() : Math.min(patternLength, input.length());
for (int l = 2; l < length; l++) {
for (int o = 0; o < input.length() - l; o++) {
multiset.add(input.substring(o, o + l));
}
}
return Ordering.from(new Comparator<Entry<String>>() {
public int compare(final Entry<String> o1, final Entry<String> o2) {
return
ComparisonChain.start()
.compare(o1.getCount(), o2.getCount())
.compare(o1.getElement(), o2.getElement())
.result();
}
}).max(multiset.entrySet()).getElement();
}
关于性能:当我将模式长度限制为12个字符时,此测试方法在我的机器上花费大约一秒钟无限长度和大约25毫秒
public static void main(final String[] args) throws Exception {
final StringBuilder sb = new StringBuilder();
final Random random = new Random();
for (int i = 0; i < 1000; i++) {
sb.append(random.nextInt(10));
}
final long t1 = System.currentTimeMillis();
final String input = sb.toString();
System.out.println(input);
System.out.println(getMostFrequentSequence(input, -1));
System.out.println(System.currentTimeMillis() - t1);
final long t2 = System.currentTimeMillis();
System.out.println(getMostFrequentSequence(input, 12));
System.out.println(System.currentTimeMillis() - t2);
}
答案 1 :(得分:1)
对于给定长度的数字,您可以将所有数字放在ArrayList中,对它们进行排序并计算重复数量(它们将彼此相邻)您将始终拥有少于1000个条目。