`
Qaohao
  • 浏览: 261435 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Java之表驱动法

    博客分类:
  • Java
阅读更多
    表驱动分为三种,分别是:直接索引、索引表、阶梯索引。一般直接索引使用比较广泛,也容易想到。今天在网上看到了一笔试题,统计一个字符串中第一次出现且频率最高的字符。看到这道题以后,我觉得使用表驱动能很快、很容易地解决问题,下面是我使用表驱动给出的解法。
public static char statMostRateChar(String str) {
    if (str != null && !"".equals(str)) {
        int charsStat[] = new int[128];
        int charsFirstIdx[] = new int[128];
        int strLen = str.length();
        
        for (int ch = 0; ch < 128;ch++) {
        	charsFirstIdx[ch] = strLen;
        }
        
        // 統計字符出現的次數
        for (int idx = 0; idx < strLen; idx++) {
            charsStat[str.charAt(idx)]++;
            // 记录字符第一次出现的位置
            if (idx < charsFirstIdx[str.charAt(idx)]) {
            	charsFirstIdx[str.charAt(idx)] = idx;
            }
        }

        int mostRateChar = 0;
        for (int ch = 1; ch < 128; ch++) {
            if (charsStat[ch] == 0) {
        	continue;
            }
            // 找频率出现最高的字符
            if (charsStat[mostRateChar] < charsStat[ch]) {
            	mostRateChar = ch;
            	// 出现频率一样时,选择出现在前面的数
            } else if (charsStat[mostRateChar] == charsStat[ch]&&
            		charsFirstIdx[mostRateChar] > charsFirstIdx[ch]) {
            	mostRateChar = ch;
            }
        }

        return (char) mostRateChar;
    } else {
        return '\0';
    }
}

    这是我对表驱动的一点认识,我觉得选择表驱动,提高代码的执行效率以及可读性,但同时却牺牲了存储空间。如果在不浪费大量空间的前提下,表驱动的确是一个不错的选择。
分享到:
评论
6 楼 jupiterpan 2009-12-06  
想法不错, 不过有点问题. 256不够用, 中文也可以存成char型, 此时charStat数组会越界.
5 楼 Qaohao 2009-08-11  
呵呵,谢谢楼上支持!以后还请多多指点。
4 楼 Qaohao 2009-08-11  
修改后的结果。
public static char statMostRateChar(String str) {
    if (str != null && !"".equals(str)) {
        int charsStat[] = new int[256];
        int charsFirstIdx[] = new int[256];
        int strLen = str.length();
       
        for (int ch = 0; ch < 256;ch++) {
        charsFirstIdx[ch] = strLen;
        }
       
        // 統計字符出現的次數
        for (int idx = 0; idx < strLen; idx++) {
            charsStat[str.charAt(idx)]++;
            // 记录字符第一次出现的位置
            if (idx < charsFirstIdx[str.charAt(idx)]) {
            charsFirstIdx[str.charAt(idx)] = idx;
            }
        }

        int mostRateChar = 0;
        for (int ch = 1; ch < 256; ch++) {
        if (charsStat[ch] == 0) {
        continue;
        }
            // 找频率出现最高的字符
        if (charsStat[mostRateChar] < charsStat[ch]) {
            mostRateChar = ch;
            // 出现频率一样时,选择出现在前面的数
            } else if (charsStat[mostRateChar] == charsStat[ch]&&
            charsFirstIdx[mostRateChar] > charsFirstIdx[ch]) {
            mostRateChar = ch;
            }
        }

        return (char) mostRateChar;
    } else {
        return '\0';
    }
}
3 楼 night_stalker 2009-08-11  
Qaohao 写道
呵呵。楼主说的很有道理!
首先,我确实糊涂了,这个的确不能拿到第一次出现且频率最高的字符。对于你后面得那两处异议,首先256,是因为java中字符占两个字节,所以使用了256;第二处就是关于表驱动,虽然我说是表驱动有些牵强,但是我觉得思想接近,如果我们一定按照书中说的那样,我觉得就有些教条。不过还是很感谢楼主对我关注!多谢指教。


吐槽点太多了 …… 忍不住回帖 ……
2 楼 Qaohao 2009-08-11  
呵呵。楼主说的很有道理!
首先,我确实糊涂了,这个的确不能拿到第一次出现且频率最高的字符。对于你后面得那两处异议,首先256,是因为java中字符占两个字节,所以使用了256;第二处就是关于表驱动,虽然我说是表驱动有些牵强,但是我觉得思想接近,如果我们一定按照书中说的那样,我觉得就有些教条。不过还是很感谢楼主对我关注!多谢指教。
1 楼 icefishc 2009-08-11  
有些问题 charsStat中字母的顺序不是原字符串中字母的顺序,  这个程序无法保证你的题目中要求的那个"第一次"
解决办法很简单 把每个字母第一次出现的位置保留下来就成了
 int charsStat[] = new int[256];  
这个256有些怪异? ASCII  extension ??

另外一个问题是把这东西归为表驱动似乎有点勉强.
按照Code Complete中的定义 表驱动是指用表中的信息来代替逻辑语句.
不知道这个术语到底是从哪来的 Code Complete也不是啥特标准的东西 但这东西看的人比较多咱们暂且用它

相关推荐

    基于表驱动法的三种实现方法

    表驱动法分为直接访问,索引访问,阶梯访问三种方式,分别对应相应代码,代码里有详细注释

    “项目驱动”教学法在Java课程群中的应用研究——以湖南交通工程学院软件工程专业为例.pdf

    在探讨“项目驱动”教学法在Java课程群中的应用时,我们首先需要了解Java课程群的背景和重要性。Java是一种广泛应用于企业级应用开发、大数据处理、移动应用开发等领域的编程语言。在软件工程专业中,Java课程群通常...

    项目任务驱动法应用于Java程序设计的教学改革与研究.pdf

    在当代教育改革的背景下,针对职业教育特别是计算机编程教育存在的问题,项目任务驱动法被提出并应用于Java程序设计教学中。本文讨论了项目任务驱动法在Java程序设计教学中的应用和研究,揭示了其对于提升学生编程...

    单机版记忆游戏的设计与实现——Java语言任务驱动教学法应用案例.pdf

    "单机版记忆游戏的设计与实现——Java语言任务驱动教学法应用案例" 本文介绍了使用Java语言设计和实现单机版记忆游戏的过程,并将其作为Java语言课程的任务驱动教学法的一个应用案例。文章首先介绍了Java语言的重要...

    Java项目开发课程中项目驱动教学法的应用设计.pdf

    Java项目开发课程中项目驱动教学法的应用设计 本文探讨了项目驱动教学法在Java项目开发课程中的应用设计。项目驱动教学法的核心是项目,没有项目做支撑,项目驱动教学法只能沦为方法论。因此,项目的选择和实施是...

    基于任务驱动法的Java教学模式探讨.zip

    "基于任务驱动法的Java教学模式探讨"正是针对这一问题进行的研究。 任务驱动法是一种以解决实际问题为导向的教学方法,它强调通过完成具体任务来学习和掌握知识。在Java教学中,这种方法可以使学生在实践中学习编程...

    项目驱动法在Java Web开发教学中的应用.pdf

    项目驱动法在Java Web开发教学中的应用 项目驱动法是指将实际项目贯穿到整个教学过程中,以学生为主,教师为辅进行教学。这种教学方法可以提高学生的积极性和兴趣,提高学生的职业素养和职业竞争力。 项目驱动法的...

    多维任务驱动教学法在JAVA教学中的应用.pdf

    多维任务驱动教学法在JAVA教学中的应用 本文探讨了多维任务驱动教学法在JAVA教学中的应用。JAVA程序设计是一门实践性很强的课程,需要学生掌握概念、动手编程和上机调试运行。传统的JAVA教学方法主要通过教师讲授,...

    表驱动LL(1)语法分析程序

    在编译原理中,表驱动LL(1)语法分析程序是一种用于解析源代码的有效方法。它的核心思想是通过构建预测分析表,根据当前输入符号和栈顶符号来决定下一步的解析动作。这个课程设计旨在让学生理解和实现这一解析技术,...

    任务驱动教学法在Java编程教学中的应用.pdf

    "任务驱动教学法在Java编程教学中的应用.pdf" 任务驱动教学法是一种以学生为中心,以任务为驱动的教学方式,属于探究式教学模式的一种。这种教学方式能够以技术应用能力和素质培养为主线,突出知识、能力、素质三者...

    基于任务驱动法的Java教学模式探讨.pdf

    基于任务驱动法的Java教学模式探讨.pdf

    项目驱动教学法在《Java EE Web组件编程技术》课程中的应用.pdf

    "项目驱动教学法在《Java EE Web组件编程技术》课程中的应用" 本文主要介绍了项目驱动教学法在《Java EE Web组件编程技术》课程中的应用。项目驱动教学法是一种以项目和案例为核心的教学方法,教学内容以项目任务为...

    Java语言教学中项目驱动教学法的应用.pdf

    【Java语言教学中的项目驱动教学法】 Java语言作为面向对象编程的重要语言,因其卓越的通用性、高效性、平台移植性和安全性,在多个领域得到广泛应用。然而,在传统的Java教学过程中,存在一些问题,如理论与实践...

    任务驱动式教学法在JAVA程序设计教学中的应用.pdf

    任务驱动式教学法在 JAVA 程序设计教学中的应用 任务驱动式教学法是指教师在教学过程中,根据已学到的知识,结合学生的认知能力,通过示范、说明等方法,指导学生完成任务的教学方法。该教学法的中心思想是“驱动...

    基于任务驱动法的“Java程序设计”有效课堂教学.pdf

    2    任务驱动法在“Java程序设计”中的应用2.1 课程内容重构为了实现有效的教学,首先需要对“Java程序设计”的课程内容进行重构。以“坦克大战”这一实训任务为例,这个任务涵盖了Java的基础语法、面向对象编程...

    任务驱动教学法在《Java语言》教学中的设计与实践.pdf

    任务驱动教学法在《Java语言》教学中的设计与实践 任务驱动教学法是一种基于建构主义学习理论的教学方法,它将传统的教学理念转变为以解决问题、完成任务为主的多维、互动式的教学理念。该方法实施过程通常包括设计...

    “项目驱动”教学法在JAVA教学中的应用.pdf

    《“项目驱动”教学法在JAVA教学中的应用》 Java作为一种广泛应用、功能强大的网络编程语言,其教学目标不仅是让学生理解和掌握知识,更重要的是培养他们学以致用,将知识灵活运用到实际问题解决中。传统的教学模式...

    项目驱动教学法在Java课程设计中的应用.pdf

    【项目驱动教学法在Java课程设计中的应用】 项目驱动教学法是一种以实际项目为核心的教学模式,它强调在学习过程中,学生通过参与实际的项目开发,掌握并应用理论知识。在Java课程设计中,这种教学方法尤其重要,...

    Java根据实体创建Mysql数据库表

    - 数据库表的命名策略可以通过`@Table(name = "table_name")`自定义,否则默认会使用驼峰命名法转换为下划线命名。 - 主键生成策略应根据实际需求选择,例如,`GenerationType.IDENTITY`适用于自动递增的主键,而`...

Global site tag (gtag.js) - Google Analytics