下面我发布了一段我编写的代码片段,试图以非常简单的方式复制游戏扫雷。我有一个小问题......
下面的代码生成一对坐标,检查特定坐标是否已经保存在ArrayList
中,如果没有,则将它们添加到列表中,重复此过程直到我有十个矿区的清单。在运行该程序时,我发现该列表包含重复项时不应该...
public class MineSweeper {
private static ArrayList mines;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
MineSweeper ms = new MineSweeper();
}
public MineSweeper(){
mines = new ArrayList(10);
generateMines();
showMines();
}
private void generateMines(){
int x = 0, y = 0, mineCount = 0;
Random rnd = new Random();
StringBuilder str = new StringBuilder();
while(mineCount != 10)
{
x = rnd.nextInt(9) + 1;
y = rnd.nextInt(9) + 1;
str.append(x).append(",").append(y);
if(!(mines.contains(str.toString())))
{
mines.add(str);
mineCount ++;
}
str = new StringBuilder();
}
}
private void showMines(){
System.out.println(mines.toString());
}
}
我相信我的if statement
会抓住任何重复但却错了。
我最终通过将if statement
更改为if(!(mines.toString().contains(str)))
有人可以告诉我这个区别吗?
答案 0 :(得分:2)
您正在检查mines
是否包含str.toString()
,而是添加str
,这是StringBuilder
个实例。由于您添加的所有对象均为StringBuilder
,mines
无法包含String
。
你应该选择你要去的课程,并坚持下去。例如,String
s:
if (!(mines.contains(str.toString()))) {
mines.add(str.toString());
mineCount++;
}
答案 1 :(得分:1)
这可能是“if(!(mines.contains(str.toString())))”的问题,我只是不知道坐标是如何被“ArrayList”对象保存和访问的。
答案 2 :(得分:0)
ArrayList包含StringBuilder,并且在mines.contains(str.toString())
中您与String(str.toString)进行比较,因此您将StringBuilder与String进行比较,因此它们永远不会相等。
你还有很多其他问题,例如mines field是static,Random不是等等
答案 3 :(得分:0)
如果我们查看你的if语句:
mines.contains(str.toString())
mines
是泛型类型ArrayList
的{{1}}(因为它具有未定义的泛型类型,它会自动使用StringBuilder
)。如果你这样做,可以检查
ArrayList<Object>
System.out.println(mines.get(1) instanceof StringBuilder); //print true
是str
对象,您已将其转换为StringBuilder
。因此,您将String
对象与StringBuilder
对象进行比较。请务必注意String
使用contains()
进行比较。
这可以用这个例子说明:
equals()
事实上,我收到StringBuilder testStrB = new StringBuilder("test");
System.out.println(testStrB.equals(testStrB.toString())); //print false
用于不兼容类型的警告。
带着你的工作陈述
equals()
似乎mines.toString().contains(str)
接受contains()
,CharSequence
是StringBuilder
的超级接口。由于mines.toString
使用整个contains()
中的String
搜索CharSequence
所代表的StringBuilder
,所以它可以正常运作。
摘要:
你的初始(非工作)if语句试图使用(对于mines
的每个元素)
StringBuilder.equals(String)
而你使用的if语句
String.contains(StringBuilder)
允许将StringBuilder
用作CharSequence
并进行比较。
感兴趣:
System.out.println(testStrB.toString().equals(testStrB)); //prints false
// (and incompatible types warning)
因此String
不能与StringBuilder
等同,但可以包含它。可能是因为equals()
需要Object
而contains()
需要CharSequence