`

从 char 数组 parseInt 实现

    博客分类:
  • java
阅读更多

代码来源于 https://svn.apache.org/repos/asf/harmony/enhanced/classlib/archive/java6/modules/luni/src/main/java/java/lang/Integer.java

 

public static int parseInt(char[] chars) {
		return parseInt(chars, 0, chars.length);
	}

	public static int parseInt(char[] chars, int offset, int length) {
		return parseInt(chars, offset, length, 10);
	}

	public static int parseInt(char[] chars, int offset, int length, int radix)
			throws NumberFormatException {
		if (chars == null || radix < Character.MIN_RADIX
				|| radix > Character.MAX_RADIX) {
			throw new NumberFormatException();
		}
		if (length == 0) {
			throw new NumberFormatException("Unable to parse");
		}

		int i = 0;
		boolean negative = (chars[i + offset] == '-');
		if (negative && ++i == length)
			throw new NumberFormatException("Unable to parse");

		if (negative) {
			offset++;
			length--;
		}
		return parseInt(chars, offset, length, radix, negative);

	}

	/** 
	 * 这个方法把要解析的字符数组映射到了负数的范围内。因为java int 的取值范围是 -2^32 ~ 2^31,负数的取值范围比正数要大
	 * @param chars 字符数组
	 * @param offset 有效的字符起始 idx
	 * @param len 有效字符长度
	 * @param radix 基数,比如 10 进制,2 进制啥的
	 * @param negative 这个数是不是负数
	 * @return
	 * @throws NumberFormatException
	 */
	public static int parseInt(char[] chars, int offset, int len, int radix,
			boolean negative) throws NumberFormatException {
		//这里的 max 取值是负数,下面解析出来的数都是负数。这里的 max 是绝对值最大,而不是实际值最大
		int max = Integer.MIN_VALUE / radix;
		int result = 0;
		for (int i = 0; i < len; i++) {
			//解析出来的第一个数字
			int digit = Character.digit(chars[i + offset], radix);
			if (digit == -1) {
				throw new NumberFormatException("Unable to parse");
			}
			if (max > result) {
				throw new NumberFormatException("Unable to parse");
			}
			//映射到负数的范围内,解析出来的数字要被减去。next 的值要比已经保存的值(next) 小
			int next = result * radix - digit;
			if (next > result) {
				throw new NumberFormatException("Unable to parse");
			}

			result = next;
		}
		if (!negative) {
			result = -result;
			if (result < 0) {
				throw new NumberFormatException("Unable to parse");
			}
		}
		return result;
	}
 

 

分享到:
评论

相关推荐

    txt读取文本

    ### 知识点详解 #### 一、Java 文件读写基础...从文件的创建与写入,到文件的读取和数据的处理,涵盖了文件操作的基本流程。这对于初学者来说是一个很好的实践案例,有助于理解 Java 中文件操作的基本概念和技术细节。

    字符串,整型数据,字符型数组互相转换源码

    在编程领域,字符串、整型数据和字符型数组是三种基本的数据类型...同时,不同编程语言可能有不同的实现方式,这里以C++和Java为例进行了展示。了解并熟练掌握这些转换技巧,对于提升编程效率和代码质量有着重要作用。

    基本数据类型包装类.pdf

    * 它是一个 final 的 char 数组,用于存储字符串的值。 * 它不能被修改,例如不能在原串上进行追加或删除操作。 * 它可以通过抽象类 AbstractStringBuilder 和 StringBuilder 实现字符串的追加和删除操作。 ...

    java实现字符串转String数组的方法示例

    Java 实现字符串转 String 数组的方法示例 Java 实现字符串转 String 数组的方法是java编程中常见的操作,下面我们将详细介绍这种方法的实现。 字符串遍历 在 Java 中,字符串是一种特殊的对象,我们可以使用循环...

    Java中的数组基础知识学习教程

    在实际开发中,数组常与其他数据结构(如链表、栈、队列等)结合使用,以实现更复杂的功能。理解并熟练运用数组,对于提升Java编程能力至关重要。通过学习数组的声明、初始化、遍历和操作,可以为后续的Java学习打下...

    字符串转换为Ascii码

    newpow.append(String.valueOf((char) Integer.parseInt(chars1[i]))); } System.out.println(newpow.toString()); ``` 这部分代码首先将`news`中的ASCII码值分割为单独的字符串数组`chars1`,然后再次遍历该数组...

    java实现js的escape和unescape

    代码片段中展示了如何使用预定义的十六进制数组`hex`来实现字符到十六进制表示的转换。具体而言,`hex`数组包含了所有可能的ASCII字符对应的十六进制表示。在实现`escape`方法时,遍历字符串中的每一个字符,如果该...

    实现两个人在控制台进行一字棋的对弈

    ### 实现两个人在控制台进行一字棋的对弈 #### 1. 项目概述 本项目旨在使用Java语言实现一个可以在控制台上运行的两人对弈的一字棋游戏(也称作井字棋)。游戏规则简单:两名玩家轮流在一个3x3的网格中放置标记...

    Java String Interview Questions.pdf

    char数组比字符串更适合存储密码,因为char数组可以在使用完毕后被清除,而字符串不能被清除。 19. 字符串的subSequence()方法是什么作用? subSequence()方法用于从原始字符串中提取一个子字符串。 20. 什么是...

    JAVA程序员面试题收集.pdf,这是一份不错的文件

    String是一个对象,不属于基本数据类型,它基于char数组实现,具有不可变性。 - 字符串操作:字符串反转可以使用StringBuilder或StringBuffer的reverse()方法;替换可以通过replace()方法实现。 - 数据类型转换:...

    java基础知识测试题.docx

    本资源摘要信息将从 Java 基础知识测试题中抽取相关知识点,总结 Java 基础知识要点,帮助开发者快速掌握 Java 基础知识。 一、变量和数据类型 1. Java 中有哪些基本数据类型? 答:Java 基本数据类型分为四种八类...

    Java编程中的性能优化如何实现

    在Java 9及以后版本,String对象进一步优化,将char数组替换为byte数组,以节省存储单字节字符时的内存空间,并引入了coder属性来处理不同编码格式,如Latin-1和UTF-16。 String对象的不可变性是其性能优化的关键...

    java招聘最新面试题

    在给出的例子中,`bitString2bytes`方法可以使用`Integer.parseInt`方法逐个解析字符串中的二进制数字,然后将它们转换为字节。例如,如果字符串"00111100 11110000"是两个字节的二进制表示,可以将其拆分为两部分,...

    java第三章上机练习题.doc

    字符串可以使用多种方式转换为数字类型,例如使用 parseInt() 方法将字符串转换为整型、使用 parseDouble() 方法将字符串转换为双精度型等。 字符串也可以使用多种方式将数字类型转换为字符串,例如使用 toString()...

    南开JAVA100题答案

    23. 数组排序:`arr.length` 获取数组长度,`arr[i]=arr[j]` 和 `arr[j]=temp` 实现数组元素交换。 24. 图形界面:`init` 和 `paint` 方法是Java图形用户界面(GUI)编程中绘制组件的方法,`g.drawString(str,25,25...

    最新华为与IBMJAVA面试题

    反转可以通过翻转其字符数组实现;替换则可以使用replace()方法。 3. 数据类型转换主要涉及装箱和拆箱操作。例如,Character与int间的转换,可以通过Character.getNumericValue()和Integer.parseInt()等方法完成。...

    JAVA API 总结

    5. **`public String(char[] value, int offset, int count)`**:根据给定的 char 数组的一部分创建一个字符串,从 `offset` 开始,长度为 `count`。 6. **`boolean equals(Object anObject)`**:检查当前字符串...

    java实现的经典递归算法三例

    1. **初始化**:将字符串转换为字符数组。 2. **递归过程**: - 如果当前层次只剩下一个字符,则直接输出。 - 否则,遍历剩余的所有字符,进行交换,并递归调用。 3. **恢复现场**:在返回之前,需要将交换的字符...

Global site tag (gtag.js) - Google Analytics