列表的嵌套哈希集

本文关键字:哈希集 嵌套 列表 | 更新日期: 2023-09-27 18:08:22

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

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

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循环中测试许多值和可能的列表组合?

列表的嵌套哈希集

为什么不使用对每个列表唯一的值作为键或标识符呢?您可以为您的键创建一个HashSet,它将解锁您的列表。

您可以使用Dictionary代替。唯一需要做的就是测试,看看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....
       }
    }
}

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

        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内部在添加项之前执行contains。换句话说,即使执行finalList.Add(newList); n次,它也只会添加newList一次。因此,不需要进行contains检查。