提问者:小点点

在哈希表中存储int而不是int32


给定两个字符串,比如hashKey和hashVal,我将这两个字符串添加到一个hash对象中。在本例中,hashVal是一个表示整数的字符串,因此我在将其存储到表中之前将其解析为整数。

现在问题来了。存储在哈希表中的值实际上是一个int32对象,这使得后面使用内部表达式很麻烦。经过长时间的查找,我无法找到一种简单的方法来存储实际的int或提取存储为int而不是int32对象的值。

下面是我尝试做的一个示例:

var myHash : HashObject;
var intTemp : int;
var hashKey : String;
var hashVal : String;
hashKey = "foobar";
hashVal = "123";

if(System.Int32.TryParse(hashVal,intTemp)) 
{
    intTemp = int.Parse(hashVal);
    myHash.Add(hashKey,hashVal);
}

// later, attempt to retrieve and use the value:

var someMath : int;
someMath = 456 + myHash["foobar"];

这将生成编译时错误:
BCE0051:运算符“+”不能与类型“int”的左手边和类型“object”的右手边一起使用。

如果尝试强制转换对象,相反,我会得到运行时错误:
InvalidCastException:无法从源类型转换为目标类型。

我知道,在使用新的int之前,我可以先将检索到的值存储在该int中,但对于我将要使用的数学量和键值对的数量来说,这将是一个非常冗长和不雅的解决方案,因此基本上否定了使用哈希表的好处。

有什么想法吗?


共3个答案

匿名用户

为什么不在表中存储hashvalinttemp的元组,而不是只存储hashval?然后您可以直接从查找中访问number值

if(System.Int32.TryParse(hashVal,intTemp)) {
    intTemp = int.Parse(hashVal);
    myHash.Add(hashKey, { hashValue : hashVal, intValue : intTemp });
}

var someMath : int;
someMath = 456 + myHash["foobar"].intValue;

匿名用户

我不熟悉unity脚本中的“hashobject”。是否可以改用哈希表?:

var myHash: Hashtable;

function Start() {
    myHash = new Hashtable();
    myHash.Add("one",1);
    myHash.Add("two",2);
}
function Update () {
    var val = myHash["one"] + myHash["two"] + 3;
    Debug.Log("val: " + val);
}

同样,在原始示例中,您将字符串值赋给哈希表,但从未使用intTemp。

匿名用户

C# : The easiest hash solution in Unity is the HashSet:
https://msdn.microsoft.com/en-us/library/bb359438(v=vs.110).aspx

(You have to include the System.Collections.Generic library)

Very simple usage, O(1) speed

// create - dont even worry setting the size it is dynamic, it will also do the hash function for you :) 

private HashSet<string> words = new HashSet<string>();

// add- usually read from a file or in a for loop etc

words.Add(newWord);

// access via other other script such as

if (words.Contains(wordToCheck)) 
  return true;