2

我有一个数组characters,我将对其进行迭代。一旦我找到了一个我以前没有找到的角色,我就会做一些事情。

这意味着我需要跟踪我已经遇到的角色。我的第一选择是HashSet,但我不确定这是否是正确的选择,因为hashing单个字符可能需要比comparing两个字符更长的时间。我想知道这是不是真的。

  1. HashSet 是正确的选择,还是有更好的选择,例如使用非常小的散列,或者根本不使用。

澄清转储

该数组实际上是一个二维数组,它是我从一个大学编写的函数中接收到的。我也需要定位每个角色的位置。某种类型的哪个字符的位置无关紧要,只要该函数没有为一种类型的字符调用两次即可。

我需要知道的是多维数组中的所有唯一字符,以及每个唯一字符的位置。

4

4 回答 4

3

如果您只关心ASCII,那么最好的方法是一个大小为 128 的数组并转换为一个 int。

 boolean[] array = new bolean[128];
 char c = 'a';
 array[(int) c] = true; 

任何更大的编码,肯定只使用我认为的地图。

于 2013-11-06T15:21:40.130 回答
1

如果你真的担心优化这个,那么你可以为你的角色使用一个查找表:

var lookup = Enumerable.Repeat(true, 256).ToArray();
var otherCharacters = HashSet<char>();

然后,您可以使用查找“小”字符,找到时将其翻转true,然后使用otherCharactersunicode 内容...

像这样的东西:

foreach (var c in myListOfChars)
{
    try
    {
        if (!lookup[(int)c]) { // do something }
        lookup[(int)c] = true;
    }
    catch (IndexOutOfRangeException e)
    {
        if (!otherCharacters.Contains(c)) { // do something }
        otherCharacters.Add(c);
    }
}

对于查找表范围之外的字符,这会有点慢,这取决于您的语言环境是否可以接受。对于基于拉丁语的字符集,这应该可以正常工作!

现在......并非所有世界都在 ascii / latin-1 范围内工作......浏览阿拉伯语文本将需要不同的范围。

编辑:嗯...我刚刚检查了GetHashCode()for numbers 的输出...嗯...事实证明 an 的哈希码int是 int 本身...所以使用我们的查找表进行优化可能只是愚蠢的.. .我接下来要检查HashSet的实现...

于 2013-11-06T15:20:54.143 回答
1

如果您在谈论简单的字符,我认为您可以使用以下简单的方法:

bool[] map = new bool[256];

对于元素访问:

map[(int)'a'];
于 2013-11-06T15:18:17.917 回答
1

您可以HashSet从如下数组中获取:

char[] array = new[] { 'a', 'a', 'b', 'c', 'c' };
HashSet<char> hashSet = new HashSet<char>(array);

这将是比自己比较和检测重复项更好的方法。

于 2013-11-06T15:17:24.417 回答