我读过Bert Bates和Katie Sierra的书Java并且有问题。
任务:制作游戏" Battleship"通过使用ArrayList实现3个类。
错误:类型中的方法setLocationCells(ArrayList< String>) SimpleDotCom不适用于参数(int [])
据我所知,ArrayList只能保存对象,而不会保留灵长类动物。因此,将位置列表(这些是int)移交给ArrayList是不可行的,因为它们是主要的。但我该如何解决呢?
代码:
public class SimpleDotComTestDrive {
public static void main(String[] args) {
int numOfGuesses = 0;
GameHelper helper = new GameHelper();
SimpleDotCom theDotCom = new SimpleDotCom();
int randomNum = (int) (Math.random() * 5);
int[] locations = {randomNum, randomNum+1, randomNum+2};
theDotCom.setLocationCells(locations);
boolean isAlive = true;
while(isAlive) {
String guess = helper.getUserInput("Enter the number");
String result = theDotCom.checkYourself(guess);
numOfGuesses++;
if (result.equals("Kill")) {
isAlive = false;
System.out.println("You took " + numOfGuesses + " guesses");
}
}
}
}
public class SimpleDotCom {
private ArrayList<String> locationCells;
public void setLocationCells(ArrayList<String> loc) {
locationCells = loc;
}
public String checkYourself(String stringGuess) {
String result = "Miss";
int index = locationCells.indexOf(stringGuess);
if (index >= 0) {
locationCells.remove(index);
if(locationCells.isEmpty()) {
result = "Kill";
} else {
result = "Hit";
}
}
return result;
}
}
public class GameHelper {
public String getUserInput(String prompt) {
String inputLine = null;
System.out.print(prompt + " ");
try {
BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
inputLine = is.readLine();
if (inputLine.length() == 0)
return null;
} catch (IOException e) {
System.out.println("IOException:" + e);
}
return inputLine;
}
}
答案 0 :(得分:2)
在Java中将ArrayList转换为int []
以下是在Java中将ArrayList<String>
转换为int[]
的简单示例。我认为最好给你一个不特定问题的例子,这样你就可以观察这个概念并学习。
如果我们在下面定义了ArrayList<String>
List<String> numbersInAList = Arrays.asList("1", "2", "-3");
然后,初学者最简单的解决方案是遍历每个列表项并添加到新数组。这是因为列表的元素是String
类型,但您需要输入int
。
我们首先创建一个与List
相同大小的新数组 int[] numbers = new int[numbersInAList.size()];
然后我们遍历列表
for (int ndx = 0; ndx < numbersInAList.size(); ndx++) {
然后在循环内部,我们首先将String
转换为int
int num = Integer.parseInt(numbersInAList.get(ndx));
但是有一个问题。我们并不总是知道String将包含数值。 Integer.parseInt
出于这个原因抛出异常,所以我们需要处理这种情况。对于我们的示例,我们只打印一条消息并跳过该值。
try {
int num = Integer.parseInt(numbersInAList.get(ndx));
} catch (NumberFormatException formatException) {
System.out.println("Oops, that's not a number");
}
我们希望将这个新的num
放在一个数组中,因此我们将它放在我们定义的数组中
numbers[ndx] = num;
或结合最后两个步骤
numbers[ndx] = Integer.parseInt(numbersInAList.get(ndx));
如果我们合并“Step by Step”中的所有代码,我们会得到以下内容
List<String> numbersInAList = Arrays.asList("1", "2", "-3");
int[] numbers = new int[numbersInAList.size()];
for (int ndx = 0; ndx < numbersInAList.size(); ndx++) {
try {
numbers[ndx] = Integer.parseInt(numbersInAList.get(ndx));
} catch (NumberFormatException formatException) {
System.out.println("Oops, that's not a number");
}
}
请注意,有更优雅的解决方案,例如使用Java 8流。此外,通常不建议将ints
存储为Strings
,但可能会发生,例如阅读输入。
答案 1 :(得分:0)
我无法看到您在代码中调用setLocationCells(ArrayList<String>)
的位置,但如果唯一的问题是将整数存储到ArrayList
中,则有一个解决方案:
ArrayList<Integer> myArray = new ArrayList<Integer>();
myArray.add(1);
myArray.add(2);
确实,您不能将原始类型用作泛型,但您可以使用Java包装器类型(在本例中为java.lang.Integer
)。