黑马程序员技术交流社区

标题: list数组排序出问题了。求解 [打印本页]

作者: 冥夜    时间: 2014-11-29 00:50
标题: list数组排序出问题了。求解
本帖最后由 冥夜 于 2014-11-29 01:52 编辑

需要对ArrayList<Integer>进行排序,禁止使用Collections和TreeSet。
很容易想到的是像操作数组一样进行冒泡排序,然后也做出来了。
现在楼主有一个新思路:
1.创建一个新的ArrayList<Integer>数组
2.遍历原集合寻找最小值。
3.将该最小值加入新集合然后将该最小值从原集合删除直到原集合中所有元素都被删除
4.返回新集合
因为每次寻找的都是原集合的最小值,然后依次加入的新集合,新的集合自然就是从小到大排。这样就完成了对List数组的排序。
以下是代码
private static ArrayList<Integer> sort(ArrayList<Integer> al)
        {
                ArrayList<Integer> nal=new ArrayList<Integer>();//创建一个新ArrayList集合
                int min=10;//用于保存最小值。假设原集合最大值为10
                int num;//用于存储从数组中取出的数
                while(!al.isEmpty())//如果原集合不为空则继续
                {
                        for(Iterator<Integer> it=al.iterator();it.hasNext();)//遍历集合寻找最小值
                        {
                                if((num=it.next())<min)//如果获取的值比min小就将其赋值给min
                                        min=num;
                        }        
                        if(al.remove((Integer)min))//从原集合删除最小值
                                nal.add((Integer)min);//将得到的最小值加入新集合
                }
                return nal;
        }

然后问题在于,只要一运行程序就无法停止直到内存溢出。。请问下是什么原因?

很感谢大家,已经有大神找到原因。原因在于在删除元素后,因为min并未进行重置而导致每次都在删除不存在的min并添加,由此进入死循环而导致内存溢出。

作者: 船长    时间: 2014-11-29 01:43
找到原因了楼主,你的if((num=it.next())<min)和min=num;语句,首先找的第一个数,应该是最小的吧,然后remove移除了,并在另一个集合中添加了,当你再次循环到这两个语句时,集合中没有比min还小的数了,并且集合不为空,只能无限循环了
作者: 冥夜    时间: 2014-11-29 01:46
船长 发表于 2014-11-29 01:43
找到原因了楼主,你的if((num=it.next())

谢谢啊- -表示这个完全是逻辑盲区了。。找了半天都找不到
作者: 船长    时间: 2014-11-29 01:49
本帖最后由 船长 于 2014-11-29 01:51 编辑
冥夜 发表于 2014-11-29 01:46
谢谢啊- -表示这个完全是逻辑盲区了。。找了半天都找不到

客气,请记住,我叫船长{:2_38:}这么晚了还在奋斗,加油,小伙伴!!!

作者: pillar    时间: 2014-12-2 22:46
冥夜,奋斗很晚,佩服佩服!加油!
作者: 冥夜    时间: 2014-12-2 22:55
pillar 发表于 2014-12-2 22:46
冥夜,奋斗很晚,佩服佩服!加油!

...好多天以前的了。。你进度怎么样了?

作者: pillar    时间: 2014-12-2 23:02
冥夜 发表于 2014-12-2 22:55
...好多天以前的了。。你进度怎么样了?

其实,我很早就接触java了,也一直学,但是,没有连续坚持地学,没深入地学。现在,感觉只是对她有点感觉和感情,但不算熟悉。所以我近期的目标就是不断地复习,深入理解,加强熟练度。这两天开始看CoreJava,一定要看完,看明白。
作者: 冥夜    时间: 2014-12-2 23:15
pillar 发表于 2014-12-2 23:02
其实,我很早就接触java了,也一直学,但是,没有连续坚持地学,没深入地学。现在,感觉只是对她有点感觉 ...

加油- -我也要努力了
作者: pillar    时间: 2014-12-2 23:19
冥夜 发表于 2014-12-2 23:15
加油- -我也要努力了

共勉,我的战友!相互激励着前行······
作者: quick3g    时间: 2014-12-3 19:08
public static ArrayList<Integer>  sort(ArrayList<Integer> al){
                ArrayList<Integer> newLs=new ArrayList<Integer>();
                Integer num=0;
                while(!al.isEmpty()){
                        int min=al.get(0);//集合的第一个值作为最小值
                        for(Iterator<Integer> it=al.iterator();it.hasNext();){
                                if((num=it.next())<min)min=num;//遍历集合一次,找到实际最小值。
                        }
                        newLs.add(min);
                        al.remove((Integer)min);
                }
                return newLs;
        }




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2