Java中统计数字和字符串奇偶位数的高效方法

Java中统计数字和字符串奇偶位数的高效方法

本教程详细探讨了在java中统计数字或字符串中奇偶位数的方法。文章首先介绍基于数值运算的传统方法及其在处理大数字(如电话号码)时可能遇到的数据类型限制,并提供了使用`long`类型优化的方案。随后,重点推荐了将数字视为字符串处理的更通用、健壮的方法,结合java stream api实现了高效简洁的奇偶位数统计,以应对实际应用中电话号码等场景的复杂性。

引言

在Java编程中,我们经常会遇到需要分析数字中每个位数属性的场景,例如统计一个给定数字中奇数位和偶数位的数量。这在处理电话号码、ID序列或其他长数字串时尤为常见。本文将深入探讨两种主要的方法:基于数值运算的传统方法和基于字符串处理的现代Java Stream方法,并分析它们的适用场景和潜在问题。

方法一:基于数值运算的逐位分析

传统的数字分析方法通常涉及使用算术运算符(取模 % 和除法 /)来逐个提取数字的每一位。

基本原理

取模运算 (% 10): 获取数字的个位数。除法运算 (/ 10): 移除数字的个位数,将剩余部分作为新的数字进行下一轮处理。循环: 重复上述步骤,直到数字变为0。

初始实现与数据类型限制

考虑以下一个初步的实现,用于统计一个整数中的奇偶位数:

public class DigitCounter {    static final int EVEN = 0; // 定义常量表示偶数    static final int ODD = 1;  // 定义常量表示奇数    /**     * 统计给定数字中符合指定余数(奇数或偶数)的位数数量。     *     * @param n         待分析的数字     * @param remainder 期望的余数 (0 for even, 1 for odd)     * @return 符合条件的位数数量     */    static int countDigitsByParity(int n, int remainder) {        int count = 0;        while (n > 0) {            int digit = n % 10; // 获取个位数            if (digit % 2 == remainder) { // 判断是否符合奇偶性                count++;            }            n = n / 10; // 移除个位数        }        return count;    }    public static void main(String[] args) {        int number = 12233;        System.out.println("数字 " + number + " 中的偶数位数量: " + countDigitsByParity(number, EVEN));        System.out.println("数字 " + number + " 中的奇数位数量: " + countDigitsByParity(number, ODD));    }}

上述代码对于较小的整数 (int 类型范围内的数字,最大约为 2 * 10^9) 能够正常工作。然而,当处理电话号码这类通常超过 int 最大值的数字时,例如 5143436111,直接使用 int 类型会导致编译错误或数据溢出。

立即学习“Java免费学习笔记(深入)”;

优化:使用 long 类型处理大数字

为了处理更大的数字,我们可以将参数类型从 int 更改为 long。long 类型在Java中可以存储更大的整数值(最大约为 9 * 10^18)。

public class LongDigitCounter {    static final int EVEN = 0;    static final int ODD = 1;    /**     * 统计给定长整型数字中符合指定余数(奇数或偶数)的位数数量。     *     * @param n         待分析的长整型数字     * @param remainder 期望的余数 (0 for even, 1 for odd)     * @return 符合条件的位数数量     */    static int countDigitsByParity(long n, int remainder) {        int count = 0;        while (n > 0) {            long digit = n % 10; // 获取个位数            if (digit % 2 == remainder) {                count++;            }            n = n / 10; // 移除个位数        }        return count;    }    public static void main(String[] args) {        long telUDM = 5143436111L; // 注意数字末尾的 'L',表示这是一个 long 类型字面量        long telJean = 4501897654L;        System.out.println("电话号码 " + telUDM + " 中的奇数位数量: " + countDigitsByParity(telUDM, ODD));        System.out.println("电话号码 " + telJean + " 中的偶数位数量: " + countDigitsByParity(telJean, EVEN));    }}

注意事项:

static 关键字: 在 main 方法(一个静态方法)中直接调用其他方法或访问字段时,被调用的方法和字段也必须是 static 的。这是Java的静态上下文规则。类型匹配: 确保传递给方法的参数类型与方法声明的参数类型一致。例如,不能将 String 类型的值直接传递给期望 long 类型参数的方法。

尽管使用 long 类型可以解决大部分电话号码的长度问题,但电话号码在实际应用中往往被视为字符串,因为它们可能包含非数字字符(如 -, `,+)或前导零,且其长度可能超过long` 的最大值(例如国际电话号码)。

怪兽AI数字人 怪兽AI数字人

数字人短视频创作,数字人直播,实时驱动数字人

怪兽AI数字人 44 查看详情 怪兽AI数字人

方法二:基于字符串处理和Java Stream API

将电话号码或其他长数字序列视为字符串进行处理是更通用和健壮的方法。Java 8引入的Stream API提供了一种声明式、高效的方式来处理集合数据,包括字符串中的字符。

核心思想

字符串到字符流: 将 String 转换为字符流 (IntStream)。字符到数字: 将每个字符转换为其对应的数字值。过滤: 根据奇偶性条件过滤数字。计数: 统计符合条件的数字数量。

实现示例

import java.util.stream.IntStream;public class StringDigitCounter {    public static void main(String[] args) {        String telUDM = "5143436111";        String telJean = "4501897654";        System.out.println("I have " + countOdd(telUDM) + " odd digits in telUDM");        System.out.println("I have " + countEven(telJean) + " even digits in telJean");    }    /**     * 统计字符串中偶数位的数量。     *     * @param numberString 待分析的数字字符串     * @return 偶数位的数量     */    private static long countEven(String numberString) {        // 将字符串转换为字符流        return numberString.chars()                           // 将每个字符转换为其对应的数字值 (e.g., '5' -> 5)                           .map(Character::getNumericValue)                           // 过滤出偶数                           .filter(StringDigitCounter::isEven)                           // 统计数量                           .count();    }    /**     * 统计字符串中奇数位的数量。     *     * @param numberString 待分析的数字字符串     * @return 奇数位的数量     */    private static long countOdd(String numberString) {        return numberString.chars()                           .map(Character::getNumericValue)                           .filter(StringDigitCounter::isOdd)                           .count();    }    /**     * 判断一个整数是否为偶数。     *     * @param number 待判断的整数     * @return 如果是偶数则返回 true,否则返回 false     */    private static boolean isEven(int number) {        return number % 2 == 0;    }    /**     * 判断一个整数是否为奇数。     *     * @param number 待判断的整数     * @return 如果是奇数则返回 true,否则返回 false     */    private static boolean isOdd(int number) {        return number % 2 == 1;    }}

代码解析:

numberString.chars(): 这个方法返回一个 IntStream,其中每个元素是字符串中字符的ASCII/Unicode值。.map(Character::getNumericValue): 这是一个中间操作,将 IntStream 中的每个字符(的ASCII值)映射为其对应的整数数字值。例如,字符 ‘5’ 的ASCII值可能很高,但 Character.getNumericValue(‘5’) 会返回整数 5。.filter(StringDigitCounter::isEven) / .filter(StringDigitCounter::isOdd): 这是另一个中间操作,根据提供的谓词(isEven 或 isOdd 方法)过滤流中的元素,只保留符合条件的数字。.count(): 这是一个终端操作,返回流中剩余元素的数量。

这种方法不仅简洁、可读性强,而且能够优雅地处理任意长度的数字字符串,是处理电话号码等场景的最佳实践。

总结与最佳实践

在Java中统计数字的奇偶位数,我们可以选择以下方法:

数值运算方法:适用场景: 当处理的数字确定在 int 或 long 类型范围内,且不需要考虑非数字字符时。优点: 直接基于数字的算术特性,直观。缺点: 受限于数据类型范围;不适用于包含非数字字符的字符串。字符串处理结合Stream API:适用场景: 处理电话号码、ID等可能包含非数字字符、长度不确定或超出 long 范围的数字序列。优点: 健壮性高,可处理任意长度的数字字符串;代码简洁,利用Java Stream API提高了可读性和效率。缺点: 对于纯粹的小整数,可能引入轻微的字符串转换开销(通常可以忽略不计)。

最佳实践建议:

对于电话号码、身份证号等标识符,始终将其视为 String 类型处理。 这不仅能避免数据溢出问题,还能更好地处理前导零、格式符(如连字符、空格)等情况。利用Java Stream API进行字符串的字符处理。 它提供了一种函数式编程风格,使得代码更加声明式和易于维护。注意 static 上下文的规则。 在 main 方法中调用的辅助方法或引用的常量,通常需要声明为 static。

通过选择合适的方法,我们可以高效且准确地完成数字字符串中的奇偶位数统计任务。

以上就是Java中统计数字和字符串奇偶位数的高效方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/286459.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
了解Laravel中的input方法及其功能
上一篇 2026年10月19日 18:12:02
vivo X100 Pro+怎么截长图 vivo X100 Pro+截图功能讲解
下一篇 2026年9月10日 08:55:59

相关推荐

  • 问小白网页版人口 问小白AI网页版人口

    小白AI是基于人工智能的多功能在线工具,通过网页端即可访问使用。它支持智能问答、文本创作、多语言翻译、文档解析、编程辅助及个性化推荐,适用于学生、职场人士和创作者等群体,助力高效学习与工作。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 小…

    2026年10月19日
    100
  • 内存的超频潜力是否与价格成正比?

    内存超频潜力与价格并非线性正比,初期正相关但很快遭遇瓶颈。高价内存多采用优质颗粒(如三星B-die、海力士A-die),具备更好体质和更高XMP频率,提供更优超频起点;但厂商已对颗粒分级,高价位产品可能出厂即接近极限,进一步超频空间有限。相反,低价条若用料扎实,反而可能有更大超频余地。此外,CPU内…

    2026年10月19日
    000
  • PHP删除MySQL数据库数据时出错的处理办法

    在php中处理删除mysql数据时,可以通过以下步骤优雅地处理错误:1) 使用try-catch块捕捉异常,2) 记录错误日志,3) 提供用户友好的错误提示,4) 实现重试机制,5) 遵循最小权限原则,6) 定期备份数据。这样可以确保系统的稳定性和可靠性。 在处理PHP删除MySQL数据库数据时,可…

    2026年10月19日
    100
  • 周鸿祎:AI是人类的有力工具 目前无法彻底取代人类

    周鸿祎:AI是人类的有力工具 目前无法彻底取代人类周鸿祎:AI是人类的有力工具 目前无法彻底取代人类周鸿祎:AI是人类的有力工具 目前无法彻底取代人类周鸿祎:AI是人类的有力工具 目前无法彻底取代人类

    近日,周鸿祎发布视频分享了他对ai发展的见解。他表示,虽然现在很多人担心会被人工智能取代,但从当前情况来看,ai还远未达到完全替代人类的程度。 在他看来,即便AI技术再先进,也离不开人类的监督与管理。未来,人们的工作重心将转向组织、管理和训练这些智能体。 他举了一个瑞典支付巨头的例子来说明这一观点。…

    2026年10月19日 • 用户投稿
    000
  • Java方法设计:灵活处理带参数与无参数调用的策略

    Java方法设计:灵活处理带参数与无参数调用的策略Java方法设计:灵活处理带参数与无参数调用的策略Java方法设计:灵活处理带参数与无参数调用的策略Java方法设计:灵活处理带参数与无参数调用的策略

    本文深入探讨了在java中如何设计能够灵活处理带参数和不带参数调用的方法。通过介绍方法重载(method overloading)和可变参数(varargs)两种核心机制,文章详细阐述了它们的工作原理、适用场景以及实现方式,旨在帮助开发者构建更具弹性与可维护性的代码。 在软件开发中,我们经常需要设计…

    2026年10月19日 • 用户投稿
    500
  • 稳居第一,华为 UPS 连续六年领跑中国 UPS 整体市场

    稳居第一,华为 UPS 连续六年领跑中国 UPS 整体市场稳居第一,华为 UPS 连续六年领跑中国 UPS 整体市场稳居第一,华为 UPS 连续六年领跑中国 UPS 整体市场稳居第一,华为 UPS 连续六年领跑中国 UPS 整体市场

    感谢网友 autumn_dream 提供的线索! 7 月 1 日消息,根据华为数字能源方面的消息,国内权威研究机构赛迪顾问(CCID)近日发布了《2024-2025 中国 UPS 市场研究年度报告》。报告显示,2024 年华为 UPS 在中国整体 UPS 市场中继续保持领先地位,已连续六年位居市场第…

    2026年10月19日 • 用户投稿
    300
  • 在Java中如何理解基本类型与引用类型_Java数据类型方法分享

    在Java中如何理解基本类型与引用类型_Java数据类型方法分享在Java中如何理解基本类型与引用类型_Java数据类型方法分享在Java中如何理解基本类型与引用类型_Java数据类型方法分享在Java中如何理解基本类型与引用类型_Java数据类型方法分享

    基本类型直接存储值,引用类型存储对象地址;2. 基本类型赋值为值传递,引用类型传递地址副本;3. 方法中修改引用类型内容影响原对象,重新指向则不影响;4. 基本类型适合高性能计算,引用类型用于复杂结构。 在Java中,理解基本类型与引用类型是掌握语言基础的关键。它们在内存分配、赋值行为和使用方式上有…

    2026年10月19日 • 用户投稿
    600
  • VSCode代码分析:使用静态检查与复杂度评估的工具集成

    VSCode代码分析:使用静态检查与复杂度评估的工具集成VSCode代码分析:使用静态检查与复杂度评估的工具集成VSCode代码分析:使用静态检查与复杂度评估的工具集成VSCode代码分析:使用静态检查与复杂度评估的工具集成

    VSCode通过集成ESLint、Pylint、SonarLint等插件实现静态代码检查,结合CodeMetrics和GitLens评估代码复杂度,并借助配置文件与自动修复功能将质量管控融入开发流程,提升代码可维护性与稳定性。 在现代软件开发中,代码质量直接影响项目的可维护性与稳定性。VSCode …

    2026年10月19日 • 用户投稿
    200
  • 1999元起步!麦芒40手机价格提前曝光 6月25日发布

    1999元起步!麦芒40手机价格提前曝光 6月25日发布1999元起步!麦芒40手机价格提前曝光 6月25日发布1999元起步!麦芒40手机价格提前曝光 6月25日发布1999元起步!麦芒40手机价格提前曝光 6月25日发布

    中国电信麦芒40 5g 手机新品发布会定于6月25日14:30正式开启,继数码博主曝光该机核心配置信息后,其价格也提前被透露。 据悉,麦芒40将提供三种内存组合版本。其中8GB+256GB版本定价为1999元,12GB+256GB版本售价2199元,而顶配12GB+512GB版本的价格则为2499元…

    2026年10月19日 • 用户投稿
    200
  • 在Java中如何使用接口回调实现模块解耦_OOP接口回调指南

    在Java中如何使用接口回调实现模块解耦_OOP接口回调指南在Java中如何使用接口回调实现模块解耦_OOP接口回调指南在Java中如何使用接口回调实现模块解耦_OOP接口回调指南在Java中如何使用接口回调实现模块解耦_OOP接口回调指南

    接口回调通过定义接口规范实现模块间解耦,调用方持有接口引用,被调方实现并注册自身,事件触发时通过接口通知执行操作,如网络请求完成回调更新UI;实际应用中需注意内存泄漏、空指针及线程安全问题。 在Java中,接口回调是一种常见的设计手段,用于实现模块之间的解耦。它基于面向对象编程(OOP)中的多态特性…

    2026年10月19日 • 用户投稿
    100
  • 如何导出和分享你的VSCode工作区配置?

    如何导出和分享你的VSCode工作区配置?如何导出和分享你的VSCode工作区配置?如何导出和分享你的VSCode工作区配置?如何导出和分享你的VSCode工作区配置?

    通过配置.vscode文件夹中的settings.json、extensions.json等文件,可共享编辑器设置、扩展推荐及任务脚本,确保团队开发环境一致,并提交至版本控制系统实现协同。 导出和分享 VSCode 工作区配置,主要是将项目相关的设置、扩展推荐和任务脚本保存下来,让其他人能快速复现一…

    2026年10月19日 • 用户投稿
    100
  • 百度文心大模型4.5系列模型开源,国内首发平台GitCode现已开放下载!

    百度文心大模型4.5系列模型开源,国内首发平台GitCode现已开放下载!百度文心大模型4.5系列模型开源,国内首发平台GitCode现已开放下载!百度文心大模型4.5系列模型开源,国内首发平台GitCode现已开放下载!百度文心大模型4.5系列模型开源,国内首发平台GitCode现已开放下载!

    6月30日,百度正式开源了文心大模型4.5系列,并在国内领先的开源平台gitcode上首发上线,为众多企业和开发者提供真正实用、易用且可落地的大模型解决方案。 目前,全球的开发者、企业及研究机构均可在GitCode平台上免费访问并下载体验文心大模型4.5开源系列,全面支持部署、微调等多种应用场景。 …

    2026年10月19日 • 用户投稿
    100
  • 生成式AI“幻觉”困境如何破解

    生成式AI“幻觉”困境如何破解生成式AI“幻觉”困境如何破解生成式AI“幻觉”困境如何破解生成式AI“幻觉”困境如何破解

    生成式ai的“幻觉”:挑战与应对 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 生成式AI技术飞速发展,其强大的创造力令人惊叹。然而,AI“幻觉”——即AI生成看似合理但实际上不准确或虚假信息的问题——正成为制约其发展的重要障碍。 英国《自…

    2026年10月19日 • 用户投稿
    1000
  • vscode怎么同步设置到云端_vscode设置同步至云端的操作流程

    vscode怎么同步设置到云端_vscode设置同步至云端的操作流程vscode怎么同步设置到云端_vscode设置同步至云端的操作流程vscode怎么同步设置到云端_vscode设置同步至云端的操作流程vscode怎么同步设置到云端_vscode设置同步至云端的操作流程

    通过登录微软或GitHub账户并启用设置同步功能,可实现多设备间VS Code的配置、扩展、快捷键等数据一致;操作包括账户登录、选择同步内容、跨设备下载及手动触发或关闭同步。 如果您希望在多台设备间保持 Visual Studio Code 的设置一致,可以通过启用设置同步功能将配置、扩展、键盘快捷…

    2026年10月19日 • 用户投稿
    100
  • JSP页面跳转后显示空白,是什么原因导致的?

    JSP页面跳转后显示空白,是什么原因导致的?JSP页面跳转后显示空白,是什么原因导致的?JSP页面跳转后显示空白,是什么原因导致的?JSP页面跳转后显示空白,是什么原因导致的?

    JSP页面跳转后空白页面的排查指南 本文将分析JSP页面跳转后出现空白页面的常见原因及排查方法。 问题描述: 在JSP页面中,通过控制器调用方法后,跳转的目标JSP页面显示为空白。 代码结构分析: 假设系统包含数据访问层(Dao)、业务逻辑层(Controller)和表示层(JSP)。 Dao层: …

    2026年10月19日 • 用户投稿
    200
  • Java中素数判断与输入范围验证的正确实践

    Java中素数判断与输入范围验证的正确实践Java中素数判断与输入范围验证的正确实践Java中素数判断与输入范围验证的正确实践Java中素数判断与输入范围验证的正确实践

    本教程旨在解决java程序中素数判断逻辑错误和输入范围验证失效的问题。文章将详细介绍如何构建一个高效的素数判断辅助方法,并结合健壮的输入验证机制,确保用户输入符合预期,最终提供一个完整的示例代码,帮助开发者准确识别给定范围内的素数。 在Java编程中,实现一个能够正确判断素数并有效验证用户输入范围的…

    2026年10月19日 • 用户投稿
    100
  • 联电1月营收198亿元新台币,同比增长4.2%

    联电1月营收198亿元新台币,同比增长4.2%联电1月营收198亿元新台币,同比增长4.2%联电1月营收198亿元新台币,同比增长4.2%联电1月营收198亿元新台币,同比增长4.2%

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 联电公布最新财报显示,1月营收达198.07亿元新台币,环比增长4.4%,同比增长4.2%。这一成绩仅次于2022年1月的历史最高纪录,创下同期次高。 联电共同总经理王石在投资者会议上表示,公司…

    2026年10月19日 • 用户投稿
    200
  • VSCode代码导航:使用符号搜索与大纲视图的快速定位技巧

    VSCode代码导航:使用符号搜索与大纲视图的快速定位技巧VSCode代码导航:使用符号搜索与大纲视图的快速定位技巧VSCode代码导航:使用符号搜索与大纲视图的快速定位技巧VSCode代码导航:使用符号搜索与大纲视图的快速定位技巧

    掌握符号搜索和大纲视图可极大提升VSCode编码效率。使用Ctrl+Shift+O在当前文件按名称跳转符号,添加冒号可按类别分组;Ctrl+T跨文件搜索整个项目中的类或函数。大纲视图以树形结构展示文件符号层级,支持折叠展开和排序,帮助快速理解代码结构。结合使用两者,先通过大纲浏览整体结构,再用符号搜…

    2026年10月19日 • 用户投稿
    200
  • 夸克App登顶苹果应用商店下载总榜 智能工具帮年轻人解难题

    夸克App登顶苹果应用商店下载总榜 智能工具帮年轻人解难题夸克App登顶苹果应用商店下载总榜 智能工具帮年轻人解难题夸克App登顶苹果应用商店下载总榜 智能工具帮年轻人解难题夸克App登顶苹果应用商店下载总榜 智能工具帮年轻人解难题

    随着志愿填报进入关键阶段,智能工具已成为超千万考生家庭辅助决策的重要帮手。近日,在苹果应用商店(app store),夸克app及ipad版连续多日登上免费下载总榜、工具榜以及ipad免费总榜榜首。ai技术在复杂决策场景中的应用日益成熟,夸克作为效率工具的用户价值也愈发突出。 每年的志愿填报都是一场…

    2026年10月19日 • 用户投稿
    100
  • 如何通过音频测试判断麦克风的降噪效果?

    判断麦克风降噪效果需对比有无噪音环境下的录音,重点分析人声清晰度与背景噪声抑制程度。1. 准备典型噪音环境并录制纯噪音、关闭降噪讲话、开启降噪讲话三类样本,覆盖风扇、键盘、人声等不同噪音源;2. 通过耳机听感对比降噪前后背景噪音减弱情况,评估人声是否自然、有无失真或“水下音”现象;3. 观察降噪副作…

    2026年10月19日
    200

发表回复

登录后才能评论
关注微信