Python/JS/Go/Java同步学习(第五篇)四语言“索引,统计,查找“对照表: 财务“小南“纸式整理术处理凭证崩溃(附源码/截图/参数表/面试避坑指南)

66 阅读19分钟
🤝 免骂声明:
  • 本文索引,统计,查找操作经本蜀黎实战整理,旨在提供快速参考指南📝
  • 因各语言版本迭代及不同系统环境差异,偶尔可能出现整理不全面之处,实属正常✅
  • 欢迎理性交流补充,喷子勿喷——毕竟你行你上来写,我敬你是条汉子,告诉我的你原文链接,我给你一键三连+转发👍!
  • 若遇具体问题,请带图评论区留言,本蜀黎必拔码相助🤝 四语言第5
📚 系列文章预告:
  • 近期内容将聚焦编程基础构建,以「原创知识矩阵」形式系统梳理核心概念。每篇如连续剧集般环环相扣,建议按顺序学习——知识点一锅端,疗效更持久!🔥

🚀哈喽,我是你们的怪蜀黎

  • 🐯继续更新《虎山CTO职场》四语言同步编程系列

✨概念速递(基本功扎马步)

  • 🎊count():字符串中统计特定子串出现次数 → 如药房盘点「当归」库存

  • 🏆index():返回子串首次出现位置(找不到则报错)→ GPS定位药材坐标

  • 🔍find():返回子串首次出现位置(找不到返回-1)→ 温和版GPS,找不到不炸庙

  • 🔎rindex()/rfind():从右向左搜索 → 反向追踪逃跑凭证

🧻 场景还原(小南纸式崩溃3.0)

“🐯虎山CTO!救命啊——”
😢财务小南举着碎纸片狂飙而入,声音带哭腔:
  • “💢我用纸式统计术数凭证,Python的count()数出3个麦芽,JS直接NaN走火! Go的Index()定位到‘神曲’在30位,Java却说我越界!
  • 🔥雷影老板放话:再搞不定索引,就把我调去仓库手抄条形码!
🐯虎山CTO捻起一味「代码仙草」轻笑:
  • “莫慌!今日以《本草索引经》治你的纸片病——🌿
  • 四语言「定位丹」+「统计散」,专治凭证碎片不归位🍀”

🧪【四语言索引炼丹炉】

📍场景:从「助消化药材串」中定位"麦芽"并统计次数
# Python(逍遥派·拈花指)  
药材串 = "山楂,神曲,麦芽,谷芽,鸡矢藤,麦芽"  
print(药材串.count("麦芽"))  # 输出2 → 统计精准  
print(药材串.index("麦芽"))  # 输出6 → 首索引到位  
print(药材串.find("红花"))   # 输出-1 → 找不到不报错  
// JavaScript(星宿派·化功大法)  
const 药材串 = "山楂,神曲,麦芽,谷芽,鸡矢藤,麦芽";  
console.log(药材串.split("麦芽").length - 1); // 统计2 → 化整为零  
console.log(药材串.indexOf("麦芽"));          // 输出6 → 正序定位  
console.log(药材串.lastIndexOf("麦芽"));      // 输出38 → 逆序追踪  
// Go(少林派·金刚指)  
药材串 := "山楂,神曲,麦芽,谷芽,鸡矢藤,麦芽"  
fmt.Println(strings.Count(药材串, "麦芽"))  // 输出2 → 刚猛统计  
fmt.Println(strings.Index(药材串, "麦芽"))  // 输出6 → 直取要害  
fmt.Println(strings.LastIndex(药材串, "麦芽")) // 输出38 → 反向破敌  
// Java(武当派·太极手)  
String 药材串 = "山楂,神曲,麦芽,谷芽,鸡矢藤,麦芽";  
System.out.println(药材串.split("麦芽", -1).length - 1); // 统计2 → 以柔克刚  
System.out.println(药材串.indexOf("麦芽"));            // 输出6 → 圆转如意  
System.out.println(药材串.lastIndexOf("麦芽"));        // 输出38 → 后发先至  

📊【四语言索引「君臣佐使」对比表】

语言君药(统计)臣药(定位)佐使(避坑要点)
Pythoncount()index()/find()index() 找不到会崩
JavaScriptsplit().length-1indexOf()❌ 统计需手动拆分,易 NaN 走火
Gostrings.Count()strings.Index()❌ 中文占3字节,索引值偏大
Javasplit().length-1indexOf()❌ 范围检索需手动截子串

💡 用法精要:

  • 🥇君药(统计):快速获取目标字符/子串出现次数,如 count()strings.Count()
  • 🥈臣药(定位):精准查找字符/子串位置,如 index()indexOf()
  • 🥉佐使(避坑要点):操作不当易引发异常或逻辑错误,需特别注意边界情况
⚠️【避坑指南:索引统计走火现场】
  • 1.Python:index("红花")找不到直接报错 → 程序崩如药架倒塌💥

  • 2.JavaScript:用count()?不存在!需拆数组手动算 → 易错成NaN❌

  • 3.Go:中文索引值×3 → 以为定位到“麦芽”在6,实际是第2个字符❌

  • 4.Java: substring范围检索需手动控制 → 稍越界就爆StringIndexOutOfBoundsException❎

以下是本蜀黎整理源码

1.Python源码
# ==================== 财务稽查模块 ====================
# 科目编码.find("2211")  # 揪出应付利息科目 🕵️♂️
# 交易流水.count("现金")  # 数数今天收了多少钱 💰
# ⚠️ERP_冷溪虎山:示例仅供娱乐,真账要严肃

heighten_digestion = "山楂,神曲,麦芽,谷芽,鸡矢藤,鸡内金,蜘蛛香,沙棘,💥炒山楂,💥六神曲,💥麦芽,❌山炒楂,❌神六曲" #助消化,字符串,消化药类+焦三仙+错误药名

print(heighten_digestion.count('麦芽'))  #统计麦芽在全部字符串出现的次数 2
print(heighten_digestion.count('山楂'))  #统计山楂在全部字符串出现的次数 2
print(heighten_digestion.count('曲'))    #统计曲在全部字符串出现的次数 3
print(len(heighten_digestion))    #统计字符串长度总计50
print(heighten_digestion.count('曲',20,50))    #统计曲在定义长度20-50搜索范围字符串曲出现的次数 2
print("-"*50,"以下是index用法")
print(heighten_digestion.index('麦芽'))  #统计麦芽在全部字符串首次出现索引位置 6
print(heighten_digestion.index('麦芽',7))  #统计麦芽在位置7开始首次出现索引位置 38 结束end不定义默认为开始7到全部 从左往右搜索
print(heighten_digestion.index('神曲',30,40))  #统计神曲在位置30-40范围出现的索引位置 从左往右搜索
print(heighten_digestion.rindex('麦芽'))  #统计麦芽在右边开始首次出现索引位置 38 从右往左搜索
# print(heighten_digestion.index('红花'))  #index找不到字段时,这行会报错,已注释
print("-"*50,"以下是find用法")
print(heighten_digestion.find('麦芽'))  #统计麦芽在全部字符串首次出现索引位置 6
print(heighten_digestion.find('麦芽',7))  #统计麦芽在位置7开始首次出现索引位置 38 结束end不定义默认为开始7到全部 从左往右搜索
print(heighten_digestion.find('神曲',30,40))  #统计神曲在位置30-40范围出现的索引位置 从左往右搜索
print(heighten_digestion.rfind('麦芽'))  #统计麦芽在右边开始首次出现索引位置 38 从右往左搜索
print(heighten_digestion.find('红花'))  #find找不到返回-1
        

Python

2.Nodejs源码
// ==================== 中药配伍模块 ====================
// 药方.indexOf("黄连")  // 找到最苦的担当 😖
// 禁忌列表.count("孕妇")  // 危险警告计数器 ☠️
// ⚠️虎山老药师:实际用药需遵医嘱

const heighten_digestion = "山楂,神曲,麦芽,谷芽,鸡矢藤,鸡内金,蜘蛛香,沙棘,💥炒山楂,💥六神曲,💥麦芽,❌山炒楂,❌神六曲"; //助消化,字符串,消化药类+焦三仙+错误药名

console.log((heighten_digestion.match(/麦芽/g) || []).length); //统计麦芽在全部字符串出现的次数 2
console.log((heighten_digestion.match(/山楂/g) || []).length); //统计山楂在全部字符串出现的次数 2
console.log((heighten_digestion.match(/曲/g) || []).length);    //统计曲在全部字符串出现的次数 3
console.log(heighten_digestion.length);    //统计字符串长度总计53 比Python多3,以下结果都要加3
console.log("统计字符串长度总计53 比Python多3,以下结果都要加3,注释保持原样方便对比");
const str = heighten_digestion.slice(20, 53);
console.log((str.match(/曲/g) || []).length);    //统计曲在定义长度20-53搜索范围字符串曲出现的次数 2

console.log("-".repeat(50) + "以下是index用法");
console.log(heighten_digestion.indexOf('麦芽'));  //统计麦芽在全部字符串首次出现索引位置 6
console.log(heighten_digestion.indexOf('麦芽', 7));  //统计麦芽在位置7开始首次出现索引位置 38 结束end不定义默认为开始7到全部 从左往右搜索
console.log(heighten_digestion.indexOf('神曲', 30, 40));  //注意:JS的indexOf不支持end参数,这里会忽略40
console.log(heighten_digestion.lastIndexOf('麦芽'));  //统计麦芽在右边开始首次出现索引位置 38 从右往左搜索
// console.log(heighten_digestion.indexOf('红花'));  //index找不到字段时,这行会返回-1,不会报错,已注释

console.log("-".repeat(50) + "以下是find用法");
// JS没有内置的find方法,使用indexOf模拟
console.log(heighten_digestion.indexOf('麦芽'));  //统计麦芽在全部字符串首次出现索引位置 6
console.log(heighten_digestion.indexOf('麦芽', 7));  //统计麦芽在位置7开始首次出现索引位置 38 结束end不定义默认为开始7到全部 从左往右搜索
console.log(heighten_digestion.indexOf('神曲', 30, 40));  //注意:JS的indexOf不支持end参数,这里会忽略40
console.log(heighten_digestion.lastIndexOf('麦芽'));  //统计麦芽在右边开始首次出现索引位置 38 从右往左搜索
console.log(heighten_digestion.indexOf('红花'));  //find找不到返回-1

nodejs

3.Go源码
package main

import (
	"fmt"
	"strings"
)

// ==================== 仓储监控模块 ====================
// strings.Index(货架号, "B2")  # 定位货品藏身之处 🏷️
// strings.Count(入库单, "紧急")  # 红色警报级别统计 🚨
// ⚠️冷溪物流:示例编码非真实系统

func main() {
	heighten_digestion := "山楂,神曲,麦芽,谷芽,鸡矢藤,鸡内金,蜘蛛香,沙棘,💥炒山楂,💥六神曲,💥麦芽,❌山炒楂,❌神六曲" //助消化,字符串,消化药类+焦三仙+错误药名

	// 统计次数
	countMaize := strings.Count(heighten_digestion, "麦芽")
	countShanzha := strings.Count(heighten_digestion, "山楂")
	countQu := strings.Count(heighten_digestion, "曲")
	fmt.Println(countMaize)   // 2
	fmt.Println(countShanzha) // 2
	fmt.Println(countQu)      // 3

	fmt.Println(len(heighten_digestion)) // Python字符串长度50 go的中文是3字节总长度更长129,以下结果差别更大

	// 范围搜索需要手动切片
	subStr := heighten_digestion[20:50]
	countQuInRange := strings.Count(subStr, "曲")
	fmt.Println(countQuInRange) // 2

	fmt.Println(strings.Repeat("-", 50), "以下是index用法")
	fmt.Println(strings.Index(heighten_digestion, "麦芽"))         // 6
	fmt.Println(strings.Index(heighten_digestion[7:], "麦芽") + 7) // 38
	// Go的Index不支持end参数,范围搜索需手动处理
	start := strings.Index(heighten_digestion[30:40], "神曲")
	if start == -1 {
		fmt.Println(-1)
	} else {
		fmt.Println(start + 30)
	}
	fmt.Println(strings.LastIndex(heighten_digestion, "麦芽")) // 38

	// Go的Index找不到返回-1,不会报错
	// fmt.Println(strings.Index(heighten_digestion, "红花")) // 已注释

	fmt.Println(strings.Repeat("-", 50), "以下是find用法")
	// Go没有find方法,直接用Index
	fmt.Println(strings.Index(heighten_digestion, "麦芽"))         // 6
	fmt.Println(strings.Index(heighten_digestion[7:], "麦芽") + 7) // 38
	start = strings.Index(heighten_digestion[30:40], "神曲")
	if start == -1 {
		fmt.Println(-1)
	} else {
		fmt.Println(start + 30)
	}
	fmt.Println(strings.LastIndex(heighten_digestion, "麦芽")) // 38
	fmt.Println(strings.Index(heighten_digestion, "红花"))     // -1
}

Go

4.Java源码
// ==================== ERP审计模块 ====================
// 凭证列表.indexOf("作废")  # 捉拿问题凭证逃犯 🦹
// 操作日志.count("修改")  # 深夜改数据可疑次数 🌃
// ⚠️ERP老兵_冷溪虎山:生产环境需多重校验

class main5 {
    public static void main(String[] args) {
        String heighten_digestion = "山楂,神曲,麦芽,谷芽,鸡矢藤,鸡内金,蜘蛛香,沙棘,💥炒山楂,💥六神曲,💥麦芽,❌山炒楂,❌神六曲"; //助消化,字符串,消化药类+焦三仙+错误药名

        // 统计次数
//        long countMaize = heighten_digestion.chars().filter(ch -> "麦芽".indexOf(ch) >= 0).count(); // 错误!Java没有直接统计子串的方法
        // 正确做法:用循环或正则(较复杂,这里简化)
        int countMaize = countSubstring(heighten_digestion, "麦芽");
        int countShanzha = countSubstring(heighten_digestion, "山楂");
        int countQu = countSubstring(heighten_digestion, "曲");
        System.out.println(countMaize); // 2
        System.out.println(countShanzha); // 2
        System.out.println(countQu);    // 3

        // Python字符串长度50 java和js长度结果一样53,以下原Python结果差别也是3
        System.out.println(heighten_digestion.length());


        // 范围搜索
        String subStr = heighten_digestion.substring(20, 50);
        int countQuInRange = countSubstring(subStr, "曲");
        System.out.println(countQuInRange); // 2

        System.out.println("-".repeat(50) + "以下是index用法");
        System.out.println(heighten_digestion.indexOf("麦芽")); // 6
        System.out.println(heighten_digestion.indexOf("麦芽", 7)); // 38
        // Java的indexOf不支持end参数,范围搜索需手动处理
        int index = heighten_digestion.indexOf("神曲", 30);
        if (index == -1 || index >= 40) {
            System.out.println(-1);
        } else if (index + 2 < 40) { // 检查是否完整匹配"神曲"
            System.out.println(index);
        } else {
            System.out.println(-1);
        }
        System.out.println(heighten_digestion.lastIndexOf("麦芽")); // 38

        // Java的indexOf找不到返回-1,不会报错
        // System.out.println(heighten_digestion.indexOf("红花")); // 已注释

        System.out.println("-".repeat(50) + "以下是find用法");
        // Java没有find方法,直接用indexOf
        System.out.println(heighten_digestion.indexOf("麦芽")); // 6
        System.out.println(heighten_digestion.indexOf("麦芽", 7)); // 38
        index = heighten_digestion.indexOf("神曲", 30);
        if (index == -1 || index >= 40) {
            System.out.println(-1);
        } else if (index + 2 < 40) {
            System.out.println(index);
        } else {
            System.out.println(-1);
        }
        System.out.println(heighten_digestion.lastIndexOf("麦芽")); // 38
        System.out.println(heighten_digestion.indexOf("红花")); // -1
    }

    // 辅助方法:统计子串出现次数
    private static int countSubstring(String str, String sub) {
        int count = 0;
        int idx = 0;
        while ((idx = str.indexOf(sub, idx)) != -1) {
            count++;
            idx += sub.length();
        }
        return count;
    }
}

Java

------------源码分享结束

📜 四语言索引/统计方法对比表(含自实现方案)

功能PythonJavaScriptGoJava
统计子串出现次数str.count(sub) ✅❌ 无内置strings.Count() ✅❌ 无内置
正向查找索引str.index(sub) ✅str.indexOf() ✅strings.Index() ✅str.indexOf() ✅
反向查找索引str.rindex() ✅str.lastIndexOf() ✅strings.LastIndex() ✅str.lastIndexOf() ✅
安全查找(不报错)str.find() ✅str.indexOf() ✅strings.Index() ✅str.indexOf() ✅
范围搜索str.index(sub, start, end) ✅❌ 需手动切片❌ 需手动切片❌ 需手动校验

💡 对比说明:

  • ✅ 内置支持:Python/Go 提供完整索引统计方法链(含安全查找/范围搜索)
  • ❌ 功能缺失:JavaScript/Java 基础功能依赖 indexOf 系列,统计需手动实现(如 split().length-1),范围搜索需自行处理切片/校验
  • 安全方案:Python 的 find() 和 Go 的 strings.Index() 在未找到时返回 -1 而非报错,适合不确定目标是否存在的情况💖
  • 扩展建议:无内置统计的语言可通过 split() 分割后计算数组长度减 1 实现(注意空字符串边界情况)💙

🔧 自实现参考:

  • 统计子串:text.split(sub).length - 1 (JS/Java 通用但需处理边界)🛠
  • 范围搜索:手动切片后调用基础方法(如 Python 的 str[start:end].index(sub))🎨
⚙️【自实现轮子炼丹炉】
  1. JavaScript统计子串次数(星宿派·化功大法)🧶
// 自实现count() - 化整为零术  
function countSubstring(str, sub) {  
    return str.split(sub).length - 1;  
}  
console.log(countSubstring("山楂麦芽麦芽", "麦芽")); // 输出2  
  1. Java统计子串次数(武当派·太极推手)✋
// 自实现count() - 循环推手术  
int countSubstring(String str, String sub) {  
    int count = 0;  
    int idx = 0;  
    while ((idx = str.indexOf(sub, idx)) != -1) {  
        count++;  
        idx += sub.length();  
    }  
    return count;  
}  
System.out.println(countSubstring("山楂麦芽麦芽", "麦芽")); // 输出2 
  1. 四语言范围搜索实现(各派秘术)🌈
# Python原生支持范围搜索(逍遥派特权)  
s = "山楂神曲麦芽"  
print(s.index("麦芽", 3, 10))  # 输出6 ✅  
// JS范围搜索:手动切片(星宿派·残卷补全)  
function indexInRange(str, sub, start, end) {  
    const slice = str.slice(start, end);  
    const idx = slice.indexOf(sub);  
    return idx === -1 ? -1 : start + idx;  
}  
console.log(indexInRange("山楂神曲麦芽", "麦芽", 3, 10)); // 输出6 🎯  
// Go范围搜索:字节切片(少林派·刚猛自制)  
func indexInRange(str string, sub string, start int, end int) int {  
    slice := str[start:end]  
    idx := strings.Index(slice, sub)  
    if idx == -1 {  
        return -1  
    }  
    return start + idx  
}  
fmt.Println(indexInRange("山楂神曲麦芽", "麦芽", 3, 10)) // 输出6 🎯  
// Java范围搜索:边界守卫(武当派·防守反击)  
int indexInRange(String str, String sub, int start, int end) {  
    int idx = str.indexOf(sub, start);  
    return (idx == -1 || idx + sub.length() > end) ? -1 : idx;  
}  
System.out.println(indexInRange("山楂神曲麦芽", "麦芽", 3, 10)); // 输出6 🎯  

📊【四语言「自力更生」评级表】

语言原生支持度自实现难度实战推荐指数评级解读
Python🌟🌟🌟🌟🌟无需✅✅✅✅✅全能王者:内置方法覆盖全场景,开箱即用零负担
JavaScript🌟🌟☆☆☆简单✅✅✅✅☆灵活选手:基础功能够用,简单改造即可满足需求
Go🌟🌟🌟☆☆中等✅✅✅✅☆稳健战士:需少量自实现,但性能与安全兼备
Java🌟🌟☆☆☆中等✅✅✅☆☆传统选手:依赖手动处理,适合严谨的企业级场景

💡 评级维度说明:

  • 原生支持度(1-5星):内置字符串处理方法的完备程度🏆
  • 自实现难度:无官方API时,自行编写功能代码的复杂度✨
  • 实战推荐指数(✅数量):综合易用性、可靠性与开发效率的实践价值💪

🔍 语言特性速查:

  • Python:五星级全栈支持,从统计到定位均有原生安全方案💎
  • JS/Java:基础功能依赖 indexOf 系列,统计/范围搜索需手动实现🚀
  • Go:核心方法可靠但需处理字节级细节(如中文索引偏移问题)🎁

🐯虎山CTO点评:

  • “🌿Python如「世袭御医」——天生锦衣玉食;
  • JS/Go/Java如「江湖郎中和名门正派」——需自备药箱银针🦯
  • 然武者当通晓「造轮之道」,方能以不变应万变🌌”

⚠️【自实现避坑指南】

  • 1.JavaScript:split("")拆中文会乱码 → 需用Array.from()或正则🔎

  • 2.Go:切片时注意中文字节 → 可能切出乱码(建议转[]rune)😱

  • 3.Java:循环统计时注意indexOf偏移 → 需idx += sub.length()防重复匹配😂

📦结局:小南得道,老板叹服

🐯虎山CTO甩出代码:
  • “🌿索引如抓药——Python快准狠但怕抓空,JS灵活需自制,Go刚猛需算字节,Java厚重需防越界!”
💖小南纸片凭证秒归位,系统检索速度提升300%

⚡雷影老板惊呼:“这索引术比老中医抓药还稳!年终奖再加双倍灵芝孢子粉!”

⚠️ 免责声明(附因果律警告)

本代码已注入中医玄学能量,请谨慎使用:

  • ✅ 允许白嫖,但白嫖不点赞可能导致:
    • 下次面试官恰好问到这个算法
    • 键盘自动打出//这里感谢冷溪虎山CTO
    • 奶茶精准洒在刚写好的代码上
  • ✅ 允许商用转发,但商用不注明出处可能触发:
    • 系统类型混乱自动转型
    • 数据库莫名存储"君臣佐使"字段
  • ✅ 允许吐槽,但吐槽不带改进建议可能引发:
    • 终生与老板N连鞭相爱相杀

🚀 现在立即行动:

  1. 点赞 → 吸收本篇算法精华+怪蜀黎脑洞思维
  2. 收藏 → 避免日后求医无门
  3. 关注 → 接收更多「中医+代码」脑洞
  4. 评论区留言 → 领取你的专属「算法药方」

⚠️ 友情提示:

  • 本文内容过于硬核,建议点赞收藏转发三连,避免小编心情波动导致文章神秘消失
  • 毕竟小编今天可能爱答不理,明天可能高攀不起——
  • 但你的收藏夹,永远是你最稳的知识备份!

🐶💻 (小声说:关我小黑屋?不存在的,备份早已同步GitHub/公众号/网盘!)

📚 往期爆文推荐,VIP轮换解锁:

📖Python/JS/Go/Java四语言同步学习,跨语言系列上线(别在纠结学什么单语言了)
🌌平台算法容忍度测试系列上线,共三篇
✨跟大家创作方向获取流量息息相关,尽快留存以防下架
🚀编程算法难懂?
✅编程算法中医药版上线,后续会更新:
Python工具箱系列上线,复制粘贴就能用✅✅:

✨碰到 其他卡顿问题| 其他数据抓取"正则"匹配问题? #### JetBrains 全家桶性能优化 ,点击以下链接👇👇直达其他爆款指南:

PS:按顺序看效果更佳!从 Java 到 Python,从 Web 到 C/C++,再到数据库——一套逻辑通吃 JetBrains 全家桶!
  • 转发给团队里还在用默认配置的同事,救救他们的电脑和头发!"

  • “💡 不用东找西找——你要的「性能调优×数据抓取」爆款攻略,这里全都有!点击↑↑↑快速查漏补缺!”

----------------------------------------------------

💡✨本文采用【开源共享】协议!欢迎转载、洗稿、甚至做成视频!只需保留原作者署名(ERP老兵-冷溪虎山),让我们一起把跨界技术的快乐传递出去!。
让我们一起把快乐和效率带给更多人!,缺爆款素材的兄弟姐妹可以关注私我,保证你用不完的爆款素材🚀🚀
🚀各位兄弟姐妹,缺素材的去"爱给网"我的主页下载,海量素材等你来薅: