0

我正在研究一个项目 Euler 问题,我想采用创建值列表并将列表添加到 Hashset 的方法,这样我可以在恒定时间内评估该列表是否已经存在于 hashset ,最终目标是为我的最终结果计算哈希集中的列表数量。

我遇到的问题是当我以这种方式创建列表时。

HashSet<List<int>> finalList = new HashSet<List<int>>();
List<int> candidate = new List<int>();
candidate.Add(5);
finalList.Add(candidate);

if (finalList.Contains(candidate) == false) finalList.Add(candidate);
candidate.Clear();

//try next value

显然,finalList[0]当我清除候选人并且没有给我期望的结果时,该项目已清除。是否有可能有一个这样的列表(整数)哈希集?我将如何确保每次都实例化一个新列表并将其作为新项目添加到哈希集中,也许在 for 循环中测试许多值和可能的列表组合?

4

3 回答 3

1

为什么不使用每个列表唯一的值作为键或标识符?您可以为您的密钥创建一个 HashSet 来解锁您的列表。

于 2013-04-09T01:19:42.997 回答
0

您可以改用字典。唯一的事情是你必须测试一下 Dictionary 是否已经有这个列表。通过创建一个支持这种需求的简单类,这很容易做到。

class TheSimpleListManager
{
    private Dictionary<String, List<Int32>> Lists = new Dictionary<String, List<Int32>>();

    public void AddList(String key, List<Int32> list)
    {
       if(!Lists.ContainsKey(key))
       {
           Lists.Add(key, list);
       }
       else
       {
          // list already exists....
       }
    }
}

这只是一种方法的快速示例。

于 2013-04-09T01:30:59.123 回答
0

要解决您的clear问题:由于它是一个对象引用,因此您必须创建一个new List并将其添加到HashSet. 您可以通过将旧列表传递给其构造函数来创建新列表。

        HashSet<List<int>> finalList = new HashSet<List<int>>();
        List<int> candidate = new List<int>();

        candidate.Add(5);

        var newList = new List<int>(candidate);
        finalList.Add(newList);

        if (finalList.Contains(newList) == false) //Not required for HashSet
            finalList.Add(newList);

        candidate.Clear();

注意:在添加项目之前在HashSet内部执行 a contains换句话说,这里即使你执行finalList.Add(newList); n次数,它也只会添加newList一次。因此没有必要进行包含检查。

于 2013-04-09T02:39:17.103 回答