A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冥夜 中级黑马   /  2014-11-29 00:50  /  1622 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 冥夜 于 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并添加,由此进入死循环而导致内存溢出。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

9 个回复

正序浏览
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;
        }
回复 使用道具 举报
pillar 中级黑马 2014-12-2 23:19:14
9#
冥夜 发表于 2014-12-2 23:15
加油- -我也要努力了

共勉,我的战友!相互激励着前行······
回复 使用道具 举报
冥夜 中级黑马 2014-12-2 23:15:25
8#
pillar 发表于 2014-12-2 23:02
其实,我很早就接触java了,也一直学,但是,没有连续坚持地学,没深入地学。现在,感觉只是对她有点感觉 ...

加油- -我也要努力了
回复 使用道具 举报
pillar 中级黑马 2014-12-2 23:02:24
7#
冥夜 发表于 2014-12-2 22:55
...好多天以前的了。。你进度怎么样了?

其实,我很早就接触java了,也一直学,但是,没有连续坚持地学,没深入地学。现在,感觉只是对她有点感觉和感情,但不算熟悉。所以我近期的目标就是不断地复习,深入理解,加强熟练度。这两天开始看CoreJava,一定要看完,看明白。
回复 使用道具 举报
pillar 发表于 2014-12-2 22:46
冥夜,奋斗很晚,佩服佩服!加油!

...好多天以前的了。。你进度怎么样了?
回复 使用道具 举报
冥夜,奋斗很晚,佩服佩服!加油!
回复 使用道具 举报
本帖最后由 船长 于 2014-11-29 01:51 编辑
冥夜 发表于 2014-11-29 01:46
谢谢啊- -表示这个完全是逻辑盲区了。。找了半天都找不到

客气,请记住,我叫船长{:2_38:}这么晚了还在奋斗,加油,小伙伴!!!
回复 使用道具 举报
船长 发表于 2014-11-29 01:43
找到原因了楼主,你的if((num=it.next())

谢谢啊- -表示这个完全是逻辑盲区了。。找了半天都找不到
回复 使用道具 举报
找到原因了楼主,你的if((num=it.next())<min)和min=num;语句,首先找的第一个数,应该是最小的吧,然后remove移除了,并在另一个集合中添加了,当你再次循环到这两个语句时,集合中没有比min还小的数了,并且集合不为空,只能无限循环了

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马