列表的嵌套哈希集
本文关键字:哈希集 嵌套 列表 | 更新日期: 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检查。