
本文详细介绍了在java中统计给定数字(或数字字符串)中奇偶位数的多种方法。从基于数学运算的整数处理,到针对长数字和电话号码等场景推荐的字符串处理方案,文章深入探讨了不同数据类型的适用性、常见陷阱以及如何利用java stream api实现高效简洁的代码,旨在帮助开发者选择最适合其需求的实现方式。
在编程实践中,我们经常需要对数字的各个位数进行分析,例如统计一个数字中奇数位和偶数位的个数。本文将探讨在Java中实现这一功能的几种方法,并针对不同场景给出最佳实践。
最直观的方法是利用数学运算来逐位提取数字。对于一个整数 n,可以通过 n % 10 获取其个位数,然后通过 n / 10 去掉个位数,重复此过程直到 n 变为0。
1. 基本实现与常见问题
考虑以下一个初步的实现:
立即学习“Java免费学习笔记(深入)”;
public class DigitCounter {
// 定义常量用于表示奇偶性
final int EVEN = 0;
final int ODD = 1;
// 统计指定数字中与给定余数匹配的位数
static int count(int n, int remainder) {
int count = 0;
while (n > 0) {
int rem = n % 10; // 获取个位数
if (rem % 2 == remainder) { // 判断奇偶性
count++;
}
n = n / 10; // 去掉个位数
}
return count;
}
public static void main(String[] args) {
System.out.println("偶数位个数: " + count(12233, 0)); // 期望输出 2
System.out.println("奇数位个数: " + count(12233, 1)); // 期望输出 3
}
}上述代码逻辑上是正确的,但存在几个潜在问题:
2. 改进的整数处理方法(使用 long)
为了解决 int 溢出的问题,可以使用 long 类型,它拥有更大的表示范围。同时,修正常量定义使其可以在静态上下文中被引用。
public class NumberDigitCounter {
// 定义静态常量,可在静态方法中直接使用
static final int EVEN = 0;
static final int ODD = 1;
/**
* 统计长整型数字中与指定余数(0为偶数,1为奇数)匹配的位数。
* @param n 要分析的数字
* @param remainder 期望的余数(0或1)
* @return 匹配的位数个数
*/
static int countDigits(long n, int remainder) {
int count = 0;
while (n > 0) {
long rem = n % 10; // 获取个位数
if (rem % 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 + " 中奇数位个数: " + countDigits(telUDM, ODD));
System.out.println("电话号码 " + telJean + " 中偶数位个数: " + countDigits(telJean, EVEN));
}
}这种方法对于纯数字且在 long 范围内的情况是有效的。
启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。
0
尽管 long 类型可以处理较大的数字,但对于电话号码等场景,使用字符串(String)是更健壮和推荐的做法。原因如下:
1. 使用循环遍历字符串
最直接的字符串处理方式是遍历字符串中的每个字符,将其转换为数字,然后判断奇偶性。
public class StringDigitCounter {
/**
* 统计字符串中偶数数字的个数。
* @param s 包含数字的字符串
* @return 偶数数字的个数
*/
public static int countEvenDigits(String s) {
int count = 0;
for (char c : s.toCharArray()) {
if (Character.isDigit(c)) { // 确保是数字字符
int digit = Character.getNumericValue(c); // 将字符转换为数字
if (digit % 2 == 0) {
count++;
}
}
}
return count;
}
/**
* 统计字符串中奇数数字的个数。
* @param s 包含数字的字符串
* @return 奇数数字的个数
*/
public static int countOddDigits(String s) {
int count = 0;
for (char c : s.toCharArray()) {
if (Character.isDigit(c)) {
int digit = Character.getNumericValue(c);
if (digit % 2 != 0) { // 或者 digit % 2 == 1
count++;
}
}
}
return count;
}
public static void main(String[] args) {
String telUDM = "5143436111";
String telJean = "4501897654";
System.out.println("I have " + countOddDigits(telUDM) + " odd digits in telUDM");
System.out.println("I have " + countEvenDigits(telJean) + " even digits in telJean");
}
}2. 使用Java Stream API(更简洁高效)
Java 8 引入的 Stream API 提供了一种更函数式、更简洁的方式来处理集合数据,包括字符串。我们可以将字符串转换为字符流,然后进行过滤和计数。
public class StreamDigitCounter {
// 辅助方法:判断数字是否为偶数
private static boolean isEven(int number) {
return number % 2 == 0;
}
// 辅助方法:判断数字是否为奇数
private static boolean isOdd(int number) {
return number % 2 == 1;
}
/**
* 统计字符串中偶数数字的个数。
* @param s 包含数字的字符串
* @return 偶数数字的个数
*/
public static long countEven(String s) {
return s.chars() // 将字符串转换为IntStream,其中每个元素是字符的ASCII值
.filter(Character::isDigit) // 过滤掉非数字字符
.map(Character::getNumericValue) // 将字符的ASCII值转换为对应的数字值
.filter(StreamDigitCounter::isEven) // 过滤出偶数
.count(); // 统计个数
}
/**
* 统计字符串中奇数数字的个数。
* @param s 包含数字的字符串
* @return 奇数数字的个数
*/
public static long countOdd(String s) {
return s.chars()
.filter(Character::isDigit)
.map(Character::getNumericValue)
.filter(StreamDigitCounter::isOdd)
.count();
}
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");
// 示例:包含非数字字符的字符串
String complexNumber = "123-456-7890 (ext. 12)";
System.out.println("I have " + countOdd(complexNumber) + " odd digits in " + complexNumber); // 期望输出 5 (1,3,5,7,9)
System.out.println("I have " + countEven(complexNumber) + " even digits in " + complexNumber); // 期望输出 5 (2,4,6,8,0)
}
}这个Stream API的实现非常优雅和高效,它自动处理了字符到数字的转换以及非数字字符的过滤,是处理此类问题的推荐方式。
通过上述方法,您可以根据具体需求选择最合适的策略来高效、准确地统计数字或数字字符串中的奇偶位数。在实际开发中,考虑到数据的多样性和潜在的扩展性,基于字符串和Stream API的解决方案通常是最为灵活和强大的。
以上就是Java中高效统计数字奇偶性的方法与实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号