[英]Is it possible to add int into the String ArrayList with out Converting int to String in java
[英]Java error when converting String in ArrayList to int
我在Java的非常新。 我正在尝试编写彩票模拟器。 我有以下代码:
Scanner input = new Scanner(System.in);
System.out.println("Enter six whole numbers between 1 and 49 in a comma-separated list: ");
String userNumbersString = input.nextLine();
String[] userNumbersArray = userNumbersString.replaceAll("\\s+","").split(",");
ArrayList userNumbers = new ArrayList(Arrays.asList(userNumbersArray));
boolean validNumbers = true;
for(int v = 0; v <= 6; v++){
if((int)userNumbers.get(v) > 49){
validNumbers = false;
v = 7;
}else{
v++;
}
}
if(validNumbers == false){
String[] str = new String[0];
main(str);
}
它可以正确编译。 但是,当我输入一系列数字时,出现此错误:
java.lang.ClassCastException:无法将java.lang.String强制转换为java.lang.Integer。
我对为什么不能将此字符串转换为整数感到非常困惑。
抱歉,这是一个冗长的问题,但是我将不胜感激。
我刚刚意识到OutOfBounds异常是由于我的一个愚蠢的数学错误; v从0开始; 数组中有五个值,但是我给了for循环条件<=6。很抱歉。
谢谢大家的帮助。 在一起,您已经解决了我的问题。
简单来说
int
是用于表示32位整数的原始类型。 String
是包装在char
数组周围以表示字符序列的引用类型。
您不能仅将类型从int
更改为String
并使String
的字符序列神奇地变为数字。
考虑一下如何实现此转换。 您将查看每个字符,确保它是有效数字等。
更改:
if((int)userNumbers.get(v) > 49)
至:
if(Integer.parseInt(userNumbers.get(v)) > 49)
此外,在创建诸如ArrayList
泛型类型容器时,请确保您也出于类型安全性原因声明了它们存储的对象类型。
更改:
ArrayList userNumbers = new ArrayList(Arrays.asList(userNumbersArray));
至:
ArrayList<String> userNumbers = new ArrayList<String>(Arrays.asList(userNumbersArray));
这样,您调用userNumber.get()
将返回String
。 如果您不放置它,它将返回一个Object
因此您实际上将调用Integer.parseInt(Object)
,这是无效的。 您将看到一个非常不言自明的错误,如下所示:
Integer类型的方法parseInt(String)不适用于参数(Object)
编辑:
对于您的IndexOutOfBounds
错误,您尝试访问的元素数量超出了您的限制。 基本上,您希望有6个值,但是您的for
循环表示from 0 until 6 (included)
。 共7个元素: 0, 1, 2, 3, 4, 5, 6
您可以通过改变解决这个问题<= 6
至< 6
在你的循环,但解决它,所以它会工作,不管你有多少个元素有就是用最好的方式size()
的财产ArrayList
:
更改:
for(int v = 0; v <= 6; v++)
至:
for(int v = 0; v < userNumbers.size(); v++)
首先,您应该对ArrayList
使用泛型。 请更换
ArrayList userNumbers = new ArrayList(Arrays.asList(userNumbersArray));
同
ArrayList<String> userNumbers = new ArrayList<>(Arrays.asList(userNumbersArray));
但是,这不是您的问题。 这里的误解是强制转换会推断出您需要哪种类型的转化; 不会的 。 用Integer.parseInt(userNumbers.get(v))
替换(int)userNumbers.get(v)
以从String
解析int
。
类型转换并不意味着从字符串中解析Integervalue。
您应该为此使用Integer.parseInt 。
if(Integer.parseInt(userNumbers.get(v)) > 49
应该可以解决您的错误。
首先,由于for循环中<= 6,您将获得ArrayIndexOutOfBounds异常。
其次,您应该使用Integer.parseInt(String intStr)方法将每个数字转换为与int等效的数字。
这是我认为可行的精简版本:
public static void main(String[] args)
{
String testInputOne = "14,22,18,2,5,11";
boolean allNumbersAreValid = true;
String[] userNumbersStrArray = testInputOne.split(",");
for (String numberStr: userNumbersStrArray)
{
Integer number = Integer.parseInt(numberStr.trim());
if (number > 49)
{
allNumbersAreValid = false;
break;
}
}
System.out.println("Testing " + testInputOne + ": " + (allNumbersAreValid?"All valid!":"At least one invalid"));
}
如果要进一步防止输入错误(例如有人输入字母字符),可以将Integer.parseInt调用包装在try catch块中,并捕获NumberFormatException并输出适当的错误消息。
坦率地说,我对递归调用main应该做什么感到有些恐惧? :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.