Arraylist toString()方法和重复值

时间:2015-08-09 20:05:44

标签: java arraylist contains

下面我发布了一段我编写的代码片段,试图以非常简单的方式复制游戏扫雷。我有一个小问题......

下面的代码生成一对坐标,检查特定坐标是否已经保存在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)))

来解决了这个问题

有人可以告诉我这个区别吗?

4 个答案:

答案 0 :(得分:2)

您正在检查mines是否包含str.toString(),而是添加str,这是StringBuilder个实例。由于您添加的所有对象均为StringBuildermines无法包含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()CharSequenceStringBuilder的超级接口。由于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()需要Objectcontains()需要CharSequence