我需要使用ArrayList类对数组进行排列。我无法弄清楚出了什么问题

时间:2014-12-06 01:49:37

标签: java arrays algorithm arraylist

所以我在学校参加了一个ap comp sci课程,在课堂上我们正在学习java的基础知识。对于这个赋值,我们必须通过从一个一维数组中取数字并放入另一个数字来进行排列,然后删除该数字,以便不能再次拾取它。数组中的数字不能重复。我们也必须使用ArrayList类。我无法弄清楚出了什么问题! 这是创建排列的方法:

 public static ArrayList<Integer> createPerm()
    {
        ArrayList<Integer> list = new ArrayList<Integer>(10);
        Integer x = 1, remove = 0;
        for (Integer i = 0; i < 10; i++)
        {
            list.add(x);
            x++;
        }

        ArrayList<Integer> perm = new ArrayList<Integer>(10);

        for(Integer i = 0; i < 10; i++)
         {
            Integer r = (int)(Math.random() * 10) + 1;
            for (Integer j = 0; j <= list.size() - 1; j++)
            {
                if (list.get(j) == r)
                {
                    remove = j + 1;
                    list.remove(remove);
                    perm.add(r);
                }
            }
        }

        return perm;

}

1 个答案:

答案 0 :(得分:0)

我认为你(我也是:))因为你使用Integer-objects作为索引和列表元素而感到困惑。
这与List.get方法没有问题,因为只有一个get方法需要一个int,Java将Integer转换为int。
问题在于你使用list.remove()。有两种方法,一种是对象,另一种是int 因此,如果传递Integer对象,则调用remove(Object)方法。但是你传递了索引,而不是r匹配对象,所以remove方法有时会失败,因为如果之前调用remove,则元素在你的列表中是随机的。如果方法没有失败,你已经删除了带有索引值(+1)的元素,而不是匹配r的那个元素。

     for(Integer i = 0; i < 10; i++)
     {
        Integer r = (int)(Math.random() * 10) + 1;
        for (Integer j = 0; j <= list.size() - 1; j++)
        {
            if (list.get(j) == r)
            {
                remove = j + 1;
                list.remove(remove);//the main error is here you found 4 
                                    //on index 2 and removes 3 (because of +1)
                perm.add(r);
            }
        }
    }

接下来的事情是,随机可以多次提供相同的数字,
所以你不应该只循环10次。循环直到列表为空。
我已经更正了下面的代码,原始行在更正之前进行了注释。

    //for (Integer i = 0; i < 10; i++) {
    while (!list.isEmpty()) {
        Integer r = (int) (Math.random() * 10) + 1;
        for (Integer j = 0; j <= list.size() - 1; j++) {
            //if (list.get(j) == r) {
            if (list.get(j).equals(r)) {
                //remove = j + 1;
                remove = list.get(j);
                list.remove(remove);
                perm.add(r);
            }
        }
    }

在这里,我将代码更清晰一点,以便更容易阅读

public static ArrayList<Integer> createPerm() {
    ArrayList<Integer> list = new ArrayList<Integer>(10);
    for (int i = 0; i < 10; i++) {
        list.add(i+1);
    }

    ArrayList<Integer> perm = new ArrayList<Integer>(10);

    while (!list.isEmpty()) {
        int r = (int) (Math.random() * 10) + 1;
        for (int j = 0; j < list.size(); j++) {
            if (list.get(j).intValue() == r) {
                perm.add(list.remove(j));
            }
        }
    }

    return perm;
}