【问题标题】:nested hashset of lists?列表的嵌套哈希集?
【发布时间】:2013-04-09 00:59:56
【问题描述】:

我正在处理一个项目 Euler 问题,我想采用创建值列表并将列表添加到 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 循环中测试许多值和可能的列表组合?

【问题讨论】:

  • 您希望candidate[0] 成为关键吗?完全不清楚您要在这里做什么。

标签: c# list nested hashset


【解决方案1】:

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

【讨论】:

  • 如果我对列表进行排序,我可以创建列表的哈希值并将创建的哈希添加到最终结果列表吗?目标是计算我创建的唯一列表的数量。例如,(第一个候选)list = [0] = 2, [1] = 6, [2] = 7 并对这个项目列表进行哈希处理,例如 000110,然后将此哈希添加到列表或哈希集中。因此,下一次 2,6,7 出现在列表中时,它已经包含了结果哈希。不知道我是否有任何意义:)
  • 我从一开始就理解您的问题。我的观点是,您可以为每个列表生成一个唯一键,例如升级后的排序模型中的“000110”键。这些键应该在您的 HashSet 中,并且它们应该以某种方式解锁与它们对应的列表(我可以想象很多解决方案)。因此,当您将新列表“添加”到 HashSet 时,您首先通过生成其唯一键来验证它。如果可以在 HashSet 中找到 key,则无法添加该列表,因为它已经存在于您的 HashSet 中。
  • 抱歉,有人说我不清楚,所以我不知道我是否解释得足够好。好的,我将开始朝这个方向前进,然后一旦我找到一种方法来生成唯一键并将其添加到哈希集中。
  • 没问题,我只是想澄清一下我的想法。很高兴它对您有所帮助,祝您好运。
【解决方案2】:

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

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....
       }
    }
}

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

【讨论】:

    【解决方案3】:

    要解决您的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 在添加项目之前在内部执行 contains。也就是说,这里即使执行finalList.Add(newList);n 次,也只会添加一次newList。因此没有必要进行包含检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 2015-04-16
      相关资源
      最近更新 更多