黑马程序员技术交流社区

标题: java集合类问题 [打印本页]

作者: 邱成    时间: 2012-9-9 23:29
标题: java集合类问题
本帖最后由 邱成 于 2012-9-10 07:45 编辑

import java.util.*;
class Test
{
public static void diedai(Collection c)
{
  Iterator i=c.iterator();
  while(i.hasNext())
  {
   System.out.println(i.next());
  }
}
public static void main(String[] args)
{
  Student s1=new Student(2,"zhangsan");
  Student s2=new Student(3,"lisi");
  Student s3=new Student(1,"wangwu");
  ArrayList<Object> a=new ArrayList<Object>();
  a.add(s1);
  a.add(s2);
  a.add(s3);
  Collections.sort(a);
  diedai(a);  

  }
}

class Student implements Comparable
{
int num;
String name;
Student(int num,String name)
{
  this.num=num;
  this.name=name;
}
public int compareTo(Object o)
{
  Student s=(Student)o;
  return num>s.num ? 1 : (num==s.num ? 0 : -1);
}
public String toString()
{
  return "num="+num+","+"name="+name;
}
}
运行时出现出现了Collections.sort(a)找不到符号
把ArrayList<Object>a1=new ArrayList<Object>();
这句换成
ArrayList<Student>a1=new ArrayList<Student>();就出现了使用了未经检查或不安全的操作
请高手帮忙解决
作者: 王小涛    时间: 2012-9-9 23:38
哥们这句 Collections.sort(a);  使用了Collections工具类,你应该在程序开头使用静态导入
import static java.util.Collections.*;//导入的是Collections工具类的静态成员,仅是为了简化书写。
如果你不使用静态导入,可用全名,把那句代码补全为  java.util.Collections.sort(a);

作者: 王小涛    时间: 2012-9-10 00:01
本帖最后由 王小涛 于 2012-9-10 00:29 编辑

import java.util.*;
class Test
{
public static void diedai(Collection c)//括号里要加泛型哦: (Collection<Student> c),指明将要迭代的是哪种类型的集合
{
  Iterator i=c.iterator();//同样这里也要加上泛型 Iterator<Student> i=c.iterator(); 跟上面参数类型一致
  while(i.hasNext())
  {
   System.out.println(i.next());
  }
}
public static void main(String[] args)
{
  Student s1=new Student(2,"zhangsan");
  Student s2=new Student(3,"lisi");
  Student s3=new Student(1,"wangwu");
  ArrayList<Object> a=new ArrayList<Object>();//把Object换成 Student ,因为这个集合我们只用来装学生对象,不装其他。。。
  a.add(s1);
  a.add(s2);
  a.add(s3);
  Collections.sort(a);// 这里查找不到符号,是因为你没在程序开头静态导入Collections工具类的静态方法sort,或者补上全名  java.util.Collections.sort(a);
  diedai(a);  

  }
}

class Student implements Comparable<Student>//在Comparable后面也应注明泛型,
{
int num;
String name;
Student(int num,String name)
{
  this.num=num;
  this.name=name;
}
public int compareTo(Object o)//这里覆盖compareTo方法时,应指明是比较哪种类型,所以参数列表应改为(Student s)
{
  Student s=(Student)o;//使用泛型后,这句强制向下转型就多余了,应删掉
  return num>s.num ? 1 : (num==s.num ? 0 : -1);
}
public String toString()
{
  return "num="+num+","+"name="+name;
}
}



作者: 杨习平    时间: 2012-9-10 00:14
本帖最后由 杨习平 于 2012-9-10 00:16 编辑

import java.util.*;
class Test
{
public static void diedai(Collection<Student> c)//你写的方法中必须要有对象指明,集合是对Student中的属性而言
{
Iterator<Student> i=c.iterator();//迭代器也是具体一点
while(i.hasNext())
  {
   System.out.println(i.next());
  }
}

public static void main(String[] args)
{
  Student s1=new Student(2,"zhangsan");
  Student s2=new Student(3,"lisi");
  Student s3=new Student(1,"wangwu");
  ArrayList<Student> a=new ArrayList<Student>();//这里的可以说是局部的,定义好的,你针对的是Student
  a.add(s1);
  a.add(s2);
  a.add(s3);
  Collections.sort(a);
  diedai(a);  

  }
}

class Student implements Comparable<Student>//加泛型,针对的是 Student而弄比较的
{
int num;
String name;
Student(int num,String name)
{
  this.num=num;
  this.name=name;
}
public int compareTo(Student o)//这个方法也是需要指明你的自定义类
{
  Student s=(Student)o;
  return num>s.num ? 1 : (num==s.num ? 0 : -1);
}
public String toString()
{
  return "num="+num+","+"name="+name;
}
}
作者: 张飞年    时间: 2012-9-10 01:05
上面两位回答都 比较细,向他们看齐吧 ,不再重复回答嘞。
作者: 创出一片辉煌    时间: 2012-9-10 01:09
楼主应该是想明白错误的原因对吧!我们可以看“sort”方法的原码。如下“ public static <T extends Comparable<? super T>> void sort(List<T> list) {”只给楼主展示关键代码,我们可以看到此时“T ”的参数类型是Object(因为楼主没指定泛型类型,默认为Object),而此时有指明T 必须是”Comparable“的子类,可是”Object”是上帝啊,它没有父类啊!你认为符合逻辑吗?所以楼主在使用这些泛型方法时,最好指定好泛型的参数类型!如果把T定义为Student类型,此时就完全符合逻辑了,建议留住把泛型的上限和下限再好好理解一下
作者: 陈振兴    时间: 2012-9-10 08:21
这位同学应该是还没学到泛型这块!
应该还是在cmd下运行的,Collections.sort(a)找不到符号,你用eclipse的时候就会提示预编译错误。这就是典型的预编译加载失败,而你操作的是java封装好的接口,类而已,而你自定义的类必须符合规则!
Collections是工具类,所有方法均为有用方法,且方法为static。
Collections.Sort()分为两部分,一部分为排序规则;一部分为排序算法。
问题就在于:规则用来判断对象(就是楼上代码中加的泛型,这也是必须要的,基于对象的);算法是考虑如何排序(就是你用的comparable接口和Comparator)。

这是最基础也是最底层的描述,代码就看楼上。




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