Java - 如何确定最常用的分隔符是什么

3

我有一个字符串:

www.domain.com/I-Need-This-Part

我需要检测在 / 后面最常用的分隔符是什么,这种情况下是 - 。分隔符可能会根据 URL 的不同而发生变化。

一旦我弄清楚了这个问题,我将使用 .split 并传递最常用的分隔符来计算部分。

如果您能提供任何帮助,将不胜感激。

提前感谢您。


5
您是否有特定的分隔符集?还是任何字符,包括字母/数字,都可以作为分隔符?分隔符一定是单个字符吗? - nicholas.hauschild
额,除了“计算 / 后面所有分隔符的出现次数”之外,您还希望我们说些什么呢? - Jochen
4个回答

2

定义分隔符,然后计数并排序。
定义它们由您决定。
计数可以参考此链接:Java:如何计算字符串中字符的出现次数?
您可以使用TreeMap进行即时排序,并使用适当的比较器和内容类型,例如 分隔符 - 出现次数 对。 (PriorityQueue 也可以胜任)


当仅搜索最大值时,排序是不必要的。 - Marko Topolnik
你是对的。然后,在每次计数迭代之后,如果需要,可以更新存储最频繁分隔符的变量。 - zeller

1

首先想到的是:

  • 迭代要计算分隔符数量的字符串部分
  • 检查当前字符是否为分隔符(最好是O(1))
  • 有一个从字符到整数的哈希映射,如果未插入当前分隔符,则插入它,否则将该条目++
  • 遍历哈希映射以找到使用最多的分隔符

如果您只有少量的分隔符,那么应该使用zeller的答案。如果您有很多分隔符,则此算法应该更有效。


为什么不跟踪到目前为止出现最频繁的字符呢?构建整个哈希映射,然后遍历它是过度杀伤力的。 - Marko Topolnik
反例:++--+。你看到第一个 +,所以你保存了 (+, 1)。接下来的 +,你加一得到 (+, 2)。现在你看到了一个 -。你该怎么办?删除 + 吗?所以你保存了 (-, 1),然后是 (-, 2)。现在又出现了一个 +,这会使 + 成为最频繁的字符,但你不知道,因为你已经删除了那个信息。 - Misch
我理解你的观点 - 你只需要遍历一次字符串。我的想法是,你可以通过遍历N次字符串(N = 分隔符候选数)来解决问题。除非N变得非常大,否则这种方法更有效率,因为它没有涉及任何数据结构,并且多次运行相同的短字符串能够很好地重用处理器缓存。 - Marko Topolnik
1
由于字符集非常有限(128个,因为URI是ASCII),所以不需要哈希映射表。您可以在一个长度为128的整数数组中进行计数。并且应该忽略字母数字字符[A-Za-z0-9],因为它们很少被用作分隔符,但可能出现在要拆分的单词中。 - leemes

0

只需计算您认为是分隔符候选的字符数,这应该是一个非常简单的任务。例如,您可以使用indexOf来实现。

final String url  = "www.domain.com/I-Need-This-Part";
final int neededStart = url.indexOf('/')+1;
char mostFrequent = '\u0000';
int highestFreq = 0;
for (char delim : new char[] {'%', '-', '$', '+'}) {
  int cnt = 0;
  for (int i = url.indexOf(delim, neededStart); i != -1;
        i = url.indexOf(delim, i+1), cnt++);
  if (cnt > highestFreq) { highestFreq = cnt; mostFrequent = delim; }
}
System.out.println(mostFrequent);

0
假设您有一组特定的可能分隔符,您可以使用Apache Commons库并使用它们的


StringUtils.countMatches

计算出现次数的方法。

另一种方法(如果您已经有分隔符列表),可以通过创建一个 Map(键=分隔符,值=计数)来遍历字符串一次,并在遇到分隔符时将其放入 Map 中。如果它已经存在,则增加计数。从那里,您可以找出哪个条目具有最高计数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接