热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么即使值相同,哈希表中的值比较也会返回false?

如何解决《为什么即使值相同,哈希表中的值比较也会返回false?》经验,为你挑选了1个好方法。

在下面的代码中,我试图检查两个字符串是否是字谜.为此,我计算哈希表中两个字符串中的字符,方法是将唯一字符作为键存储,并将其作为值存储在字符串中.最后,当我去检查,如果每个角色都具有相同的数,我得到一个错误的输出中看到标示为代码"问题"就行了.但是当我将该行中的值转换为字符串时,代码工作正常.我错过了什么?

    static bool AreAnagrams(string input1, string input2)
    {
        Hashtable uniqueChars1 = new Hashtable();
        Hashtable uniqueChars2 = new Hashtable();

        // Go through first string and create a hash table of characters 
        AddToHashTable(input1, ref uniqueChars1);
        // Go through second string and create a second hash table of characters
        AddToHashTable(input2, ref uniqueChars2);

        // For each unique character, if the count from both hash tables are the same, they are anagrams
        if (uniqueChars1.Keys.Count != uniqueChars2.Keys.Count)
        {
            return false;
        }
        else
        {
            foreach (object key in uniqueChars1.Keys)
            {
                if (uniqueChars1[key] != uniqueChars2[key]) // ***PROBLEM HERE***
                {
                    return false;
                }
            }
        }
        return true;
    }

    static void AddToHashTable(string input, ref Hashtable uniqueChars)
    {
        foreach (char c in input)
        {

            if (!uniqueChars.ContainsKey(c))
            {
                uniqueChars.Add(c, 1);
            }
            else
            {
                int charCount = Convert.ToInt32(uniqueChars[c]);
                charCount++;
                uniqueChars[c] = charCount;
            }
        }
    }

Thomas Leves.. 5

这个Hashtable班不是通用的; 它只包含Objects,而不是特定类型.

当你这样做:

if (uniqueChars1[key] != uniqueChars2[key])

编译时类型uniqueChars[key]Object,不是Int32.所以你正在使用Object不等式运算符的实现,它只是比较引用.由于Int32是一个值类型,并且索引器返回一个对象,因此该值被加框 ; 并且由于您正在装箱两个值,因此您将获得两个不同的对象实例,因此引用相等性始终返回false.

你有几个选择:

使用a Dictionary,这是通用的等价物Hashtable

int在比较之前将值转换为:

if ((int)uniqueChars1[key] != (int)uniqueChars2[key])

使用该Equals方法比较值:

if (!uniqueChars1[key].Equals(uniqueChars2[key]))

除非您仍在使用.NET 1.x,否则我强烈建议您尽可能使用通用集合.它们更安全,更直观,并且对于价值类型具有更好的性能.


旁注(与您的问题无关):您不需要Hashtable通过引用传递AddToHashTable; 如果没有ref修饰符,代码将以完全相同的方式工作,因为它Hashtable是一个引用类型,所以它始终是一个传递的引用.在ref如果你分配给别的修饰只会是有用的uniqueChars参数,或者如果你是传递一个值类型和变异的状态(这通常认为是一件坏事).我建议你阅读Jon Skeet关于值类型,引用类型和参数传递的精彩文章.



1> Thomas Leves..:

这个Hashtable班不是通用的; 它只包含Objects,而不是特定类型.

当你这样做:

if (uniqueChars1[key] != uniqueChars2[key])

编译时类型uniqueChars[key]Object,不是Int32.所以你正在使用Object不等式运算符的实现,它只是比较引用.由于Int32是一个值类型,并且索引器返回一个对象,因此该值被加框 ; 并且由于您正在装箱两个值,因此您将获得两个不同的对象实例,因此引用相等性始终返回false.

你有几个选择:

使用a Dictionary,这是通用的等价物Hashtable

int在比较之前将值转换为:

if ((int)uniqueChars1[key] != (int)uniqueChars2[key])

使用该Equals方法比较值:

if (!uniqueChars1[key].Equals(uniqueChars2[key]))

除非您仍在使用.NET 1.x,否则我强烈建议您尽可能使用通用集合.它们更安全,更直观,并且对于价值类型具有更好的性能.


旁注(与您的问题无关):您不需要Hashtable通过引用传递AddToHashTable; 如果没有ref修饰符,代码将以完全相同的方式工作,因为它Hashtable是一个引用类型,所以它始终是一个传递的引用.在ref如果你分配给别的修饰只会是有用的uniqueChars参数,或者如果你是传递一个值类型和变异的状态(这通常认为是一件坏事).我建议你阅读Jon Skeet关于值类型,引用类型和参数传递的精彩文章.


推荐阅读
  • 本文介绍了在实现了System.Collections.Generic.IDictionary接口的泛型字典类中如何使用foreach循环来枚举字典中的键值对。同时还讨论了非泛型字典类和泛型字典类在foreach循环中使用的不同类型,以及使用KeyValuePair类型在foreach循环中枚举泛型字典类的优势。阅读本文可以帮助您更好地理解泛型字典类的使用和性能优化。 ... [详细]
  • 把某些固定的数据源绑定写到类的方法里,能够使代码更好的适应变化。下面的方法并没有放到类里只是简单的做了示范:protectedvoidPage_Load(objectsen ... [详细]
  • 1.{#if}{#if|COND|}..{#elseif|COND|}..{#else}..{#if}Examples:{#if2*816}good{#else}fa ... [详细]
  • 一开始的思想是:在英雄周围形成一个半径为r的圆圈,并设定向下即设定target.transform.forward为0度角的向量和每45度角有一个可以占 ... [详细]
  • 一、HashMap1.HashMap概述:HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是 ... [详细]
  • 常用API-Hashtable类及其与HashMap、HashSet的区别转载请表明出处:http:blog.csdn.netu012637501(嵌入式_小J的天空)一、Hashtable&l ... [详细]
  • 最近无聊,用BCB多线程操作一下数据库,没想到开两个线程,做查询操作和插入操作,点击得快一点就出现占线错误,当场晕倒,一看就是查询问题,翻了本网站的所有记录,解决方法有几个,就是不能解决!JAVA里面 ... [详细]
  • HashMap及HashTable源码解析HashMap在java和Android经常使用到,之前学过数据结构,理解了它的原理,却很 ... [详细]
  • (2.1.8)Java之集合类:set、list、hashmap、hashtable等和迭代器iterator
    一、容器常见的集合类有这些种:实现Collection接口的:Set、List以及他们的实现类。实现Map接口的:HashMap及其实现类编程爱好者学习,下面我我们通过一个图来整体描述一下:这个图片没 ... [详细]
  • 用户购买商品时if(e.CommandName.ToLower()"buy"){判断用户购物车是否为空如果为空则分配 ... [详细]
  • 一、继承关系publicclassHashtable<K,V>extendsDictionary<K,V>implementsMap<K,V>,Clo ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
author-avatar
Never_F_Y
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有