将.indexOf()与ArrayList <string>

时间:2018-07-01 16:47:47

标签: java arrays

我正在尝试使用Java创建战舰游戏。实际的游戏可行,但是在此过程中我遇到了一个令人惊讶的问题(对我而言)。下面的代码从49个值的网格中生成一个随机位置,用户必须从中猜测。作为调试工具,我认为我会打印出ArrayList的数字值的索引,但是我得到了-1(发现这意味着找不到值)。考虑到我的数学正确,为什么它没有返回数字?

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class GameHelper 
{
String alphabet = "abcdefg";
private int gridLength=7;
private int gridSize=49;
private int [] grid = new int [gridSize];
private int comCount=0;

public String getUserInput(String prompt)
{
    String inputLine=null;
    System.out.println(prompt);

    try
    {
        BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
        inputLine=is.readLine();
        if (inputLine.equals(null))
        {
            return null;
        }
    }

    catch(IOException e)
    {
        System.out.println("Buffered Reader Failure");
    }
    return inputLine;
}


public ArrayList <String> placeDotCom (int size)
{
    ArrayList <String> alphaCells = new ArrayList <String>();

    String temp=null;
    int [] coords=new int[size];
    int attempts=0;
    boolean success=false;
    int location=0;

    comCount++;
    int incr=1;
    if((comCount%2)==1)
    {
        incr=gridLength;
    }

    while (!success & attempts++ < 200)
    {
        location = (int)(Math.random()*gridSize);
        int x=0;
        success=true;
        while (success && x < size)
        {
            if (grid[location] ==0)
            {
                coords[x++]=location;
                location+=incr;
                if(location >= gridSize)
                {
                    success = false;
                }
                if(x>0 && (location % gridLength ==0))
                {
                    success = false;
                }
            }
                else
                {
                    System.out.println("used" + location);
                    success=false;
                }
            }
        }


        int x=0;
        int row=0;
        int column=0;

        while(x < size)
        {
            grid[coords[x]] = 1;
            row = (int)(coords[x]/gridLength);
            column = coords[x] % gridLength;
            temp = String.valueOf(alphabet.charAt(column));

            alphaCells.add(temp.concat(Integer.toString(row)));
            x++;
        }
        System.out.println("coord "+x+" = "+alphaCells.get(x-1));
        return alphaCells;
    }

} 

我的未接来电:

for (DotCom dcset : dc)
{
ArrayList <String> newLocation = helper.placeDotCom(3);
dcset.setLocationCells(newLocation);
System.out.println(newLocation.indexOf(1));
}

我认为这是唯一相关的代码。如果您希望我发布更多信息,请告诉我。这是我第一次发帖,我不确定我是否正确地问了这个问题。这太模糊了吗?

1 个答案:

答案 0 :(得分:3)

来自the documentation of ArrayList#indexOf(Object o)

  

返回指定元素在此列表中首次出现的索引,如果该列表不包含该元素,则返回-1。更正式地,返回最低索引i,使Objects.equals(o, get(i))-1(如果没有这样的索引)。

请注意,该方法期望使用Object作为参数(这是有历史原因的,它源于Java没有泛型且所有容器都使用Object的黑暗时代)。

现在,您声明了ArrayList <String> newLocation并在该对象上调用.indexOf(1)。传递的int值将autoboxed放入Integer中。由于您的newLocation列表仅包含String,因此在列表中找不到传递的Integer。因此,它返回一个-1


关于您的代码的注释:当我写in my comment时,inputLine.equals(null)将返回false(如果inputLine不是null)或抛出{ {1}}(如果NullPointerExceptioninputLine)。这是由于以下事实:如果程序尝试访问null引用上的属性或方法,则会抛出null。只需输入NullPointerException(在这种情况下,inputLine == null是正确的)。一种替代解决方案是proposed by Szychan in the comments:您可以使用Objects.isNull(inputLine)来检查==是否为inputLine