黑马程序员技术交流社区

标题: 关于集合的一个问题,求大神解答!! [打印本页]

作者: 悠然的我    时间: 2013-12-31 18:43
标题: 关于集合的一个问题,求大神解答!!
本帖最后由 悠然的我 于 2014-1-1 22:36 编辑

自己写的一个反序集合的方法,但是有提示语法错误
  public static void myReverse(List<?> list) //带?泛型就提示语法错误,去掉则可以正常运行
{
        int max=list.size()-1;
        int min=0;
        for(min=0;min<max;min++,max--)
        {
                Object maxObj=list.get(max);
                Object minObj=list.get(min);
                list.set(max, minObj);//错误就在这,不知道set有什么问题,?不是代表任意类型么,我存Obj怎么也报错呢
                list.set(min, maxObj);        
        }
}


作者: 776699    时间: 2013-12-31 20:15
public static void myReverse(List<?> list)
        {
                                //定义一个集合存,翻转后的对象。
                                List list1=new ArrayList();
                for(int max=list.size()-1;0<=max;max--)
                {
                       list1.add(list.get(max));
                }
                System.out.println(list1.toString());//打印翻转后的对象。
        }
作者: taoge    时间: 2013-12-31 20:47
楼主请注意,用?这种通配符修饰的泛型集合是不能向其中添加数据的,只能从中读数据
作者: 悠然的我    时间: 2014-1-1 22:33
感谢各位的回答:找到jar包中的源码,抄袭版本如下:
        public static void myReverse(List<?> list)
        {
                int size = list.size();
                if (size < 18 || list instanceof RandomAccess)
                {
                        for (int i = 0, mid = size >> 1, j = size - 1; i < mid; i++, j--)
                                swap(list, i, j);
                }
                else
                {
                        ListIterator fwd = list.listIterator();
                        ListIterator rev = list.listIterator(size);
                        for (int i = 0, mid = list.size() >> 1; i < mid; i++)
                        {
                                Object tmp = fwd.next();
                                fwd.set(rev.previous());
                                rev.set(tmp);
                        }
                }

        }

        public static void swap(List<?> list, int i, int j)
        {
                final List l = list;
                l.set(i, l.set(j, l.get(i)));
        }
swap中的代码根本就是强制转换么,着个粘到我的代码里依然是有警告的。
看来直接set和使用ListIterator 迭代器都是可行的方法。我还以为源码就不会有警告了呢。




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