《编程珠玑》第二章问题C:找出相同的英文单词(单词改变顺序可以互相转化即为相同)

本文介绍了一个Java程序,该程序用于从指定文件中读取文本并进行处理,包括去除标点符号、转换为小写及排序等操作。接着通过指纹算法找出文本中具有相同特征的不同词汇,适用于文本分析和相似词查找。
public class FindSameWord {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String filename = "doc//obama.txt";
        FindSameWord fs = new FindSameWord();
        String txt = fs.getTXT(filename);
        ArrayList<String> arrayList = new ArrayList<String>();
        HashMap<String, String> fingerPrint = new HashMap<String, String>();

        StringTokenizer st = new StringTokenizer(txt, ", ! ' . ��");// 按逗号/空格/叹号分割,其他字符自行添加

        while (st.hasMoreElements()) {
            String tmp = (String) st.nextElement();
            if (tmp != "" && tmp != null && tmp != "s" && !arrayList.contains(tmp.toLowerCase()))
                arrayList.add(tmp.toLowerCase());
        }

        System.out.println(arrayList.size());
        fs.sortList(arrayList);
        for (int i = 0; i < arrayList.size(); i++) {
//          System.out.println(i + "," + arrayList.get(i) + ":");
            if (!fingerPrint.containsKey(fs.makeFinger(arrayList.get(i))))
                fingerPrint.put(fs.makeFinger(arrayList.get(i)), arrayList.get(i));
            else
                fingerPrint.put(fs.makeFinger(arrayList.get(i)),
                        fingerPrint.get(fs.makeFinger(arrayList.get(i))) + "," + arrayList.get(i));
        }

        for (Map.Entry<String, String> entry : fingerPrint.entrySet()) {
//          System.out.println(entry.getKey() + "--->" + entry.getValue());
            if (entry.getValue().contains(","))
                System.out.println(entry.getKey() + "--->" + entry.getValue());
        }

//      System.out.println(fs.stringSort("alive"));
//      System.out.println(fs.makeFinger("aliive"));
    }

    String getTXT(String filename) {
        String txt = "";
        try {
            File file = new File(filename);
            BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
            String s = null;
            while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行
                txt = txt + s;
            }
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return txt;
    }

    ArrayList<String> sortList(ArrayList<String> al) {
        for (int i = 0; i < al.size(); i++) {
            for (int j = i + 1; j < al.size(); j++) {
                if (!stringCompare(al.get(i), al.get(j))) {
                    String tmp = al.get(i);
                    al.set(i, al.get(j));
                    al.set(j, tmp);
                }

            }
        }
        return al;
    }

    boolean stringCompare(String a, String b) {
        int aLength = a.length();
        int bLength = b.length();
        int length = 0;
        if (aLength > bLength)
            length = bLength;
        else
            length = aLength;
        for (int i = 0; i < length; i++) {
            if (a.charAt(i) < b.charAt(i))
                return true;
            if (a.charAt(i) > b.charAt(i))
                return false;
        }

        if (aLength > bLength)
            return false;
        else
            return true;
    }

    String makeFinger(String s) {
        if (s.length() == 1)
            return s;

        String fingerPrint = "";

        String print = stringSort(s);

//      System.out.println("print"+print);

        char now = print.charAt(0);
        int count = 1;

        for (int i = 1; i < print.length(); i++) {
            if (print.charAt(i) == now) {
                count++;
                if (i == print.length() - 1)
                    fingerPrint = fingerPrint + String.valueOf(now) + String.valueOf(count);
            } else {
                if (count == 1)
                    fingerPrint = fingerPrint + String.valueOf(now);
                else
                    fingerPrint = fingerPrint + String.valueOf(now) + String.valueOf(count);
                count = 1;
                now = print.charAt(i);
                if (i == print.length() - 1)
                    fingerPrint = fingerPrint + String.valueOf(now);
            }
        }
//      System.out.println(fingerPrint);
        return fingerPrint;
    }

    String stringSort(String s) {
        String after = "";

        char[] tmp = s.toCharArray();

        for (int i = 0; i < tmp.length; i++) {
            for (int j = i + 1; j < tmp.length; j++) {
                if (tmp[i] > tmp[j]) {
                    char hou = tmp[j];
                    tmp[j] = tmp[i];
                    tmp[i] = hou;
                }
            }
        }
        after = String.valueOf(tmp);

//      System.out.println(after);
        return after;
    }
}
内容概要:本文档名为《赵家湾学校后大门一百三十六栋.txt》,实则是一份综合性科研仿真资源索引,集中展示了多个技术领域的Matlab/Simulink与Python代码实现项目。内容涵盖风光互补制氢合成氨系统容量-调度优化、微电网能量管理、无人机三维路径规划、图像分割、信号处理、电力系统建模、模型预测控制(MPC)、深度学习预测模型(如LSTM、Transformer)、联邦学习、强化学习应用等多个前沿方向。文档不仅列出具体研究题目和算法模型,还整合了智能优化算法(如PSO、GWO、DBO等)、路径规划、车间调度、通信优化、雷达跟踪、元胞自动机模拟等通用技术模块,并附有网盘链接提供完整代码与仿真模型下载,旨在为科研人员提供可复现的技术支持与开发参考。; 适合人群:具备一定编程基础,从事电气工程、自动化、计算机科学、人工智能、控制工程、能源系统等相关领域的研究生、科研人员及工程技术开发者。; 使用场景及目标:①辅助高水平学术论文复现与科研项目开发;②为硕士/博士论文、课程设计、学科竞赛提供算法实现与仿真建模支持;③提升在新能源并网、智能控制、路径规划、负荷预测、故障诊断等领域的工程实践与创新能力。; 阅读建议:此文档为资源导航型材料,建议结合个人研究方向筛选对应主题,通过提供的百度网盘链接获取完整代码包,并配合相关文献进行仿真实验与参数调试,以实现高效复用、二次开发与技术创新。
内容概要:本文深入解析了AI Agent(智能体)的技术原理与系统架构,阐述其如何通过“思考-行动-观察”的闭环循环,使大语言模型(LLM)从被动应答的对话系统进化为能主动完成复杂任务的智能实体。文章详细介绍了Agent四大核心模块:作为决策中枢的LLM(大脑)、实现外部交互的工具调用(双手)、支持状态延续的记忆模块(记忆),以及驱动自主执行的规划与协调机制(协调)。同时对比了Agent与传统聊天机器人在任务规划、工具使用、记忆能力和执行闭环等方面的本质差异,并探讨了从单智能体到多智能体系统的架构演进趋势,强调专业分工对处理复杂任务的重要性。最后,文章分析了Agent模式与预设工作流模式的应用权衡,指出前者适用于灵活探索类任务,后者更适合确定性高的固定流程。; 适合人群:对人工智能、大模型应用开发感兴趣的技术人员、产品经理及研究人员,尤其适合具备一定AI基础知识、希望深入了解Agent系统设计的专业人士; 使用场景及目标:①理解AI Agent的核心架构与关键技术组件;②掌握ReAct等主流执行范式;③区分Agent与传统聊天机器人的能力边界;④判断在实际业务中应采用Agent模式还是工作流模式; 阅读建议:本文理论性强且结构清晰,建议结合实际Agent案例(如AutoGPT、LangChain应用)进行对照学习,重点关注各模块间的协同机制与设计权衡,以深化对Agent系统级思维的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值