黑马程序员技术交流社区
标题:
一个TreeSet集合的问题
[打印本页]
作者:
吴海松
时间:
2015-1-2 23:13
标题:
一个TreeSet集合的问题
谁帮我看看这个集合为什么第一个存进去的值是null呢,当我存的是两个元素的时候就不是null,结果就对的,当我存超过三个的时候有的就是存不了进去,键存进去了,值部分没存进去,结果是null,所以说Student这个类就每什么问题了,也不知道是不是JDK1.8的问题还是什么,谁帮帮看看这个代码吧,谢谢了!
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
class Test {
public static void main(String[] agrs) {
TreeMap<Student,String> room2=new TreeMap<Student, String>();
room2.put(new Student("赵六",26),"广东");
room2.put(new Student("李四",20),"广西");
room2.put(new Student("王五",24),"广州");
room2.put(new Student("黄五",23),"上海");
room2.put(new Student("曾七",21),"北京");
room2.put(new Student("曾七",20),"北京");
get(room2);
}
public static void get(TreeMap t){//获取集合元素,打印方法
Set s=t.keySet();
Iterator it=s.iterator();
while(it.hasNext()){
Student key=(Student)it.next();
String value=(String)t.get(key);
System.out.println(key.name+":"+key.age+"="+value);
}
}
}
class Student implements Comparable{//学生类
String name;
int age;
Student(String name,int age){
this.name=name;
this.age=age;
}
public int compareTo(Object obj){
//System.out.println("zhi");
if (!(obj instanceof Student)) {
throw new RuntimeException("类型错误");
}
Student std=(Student)obj;
int nub=this.name.compareTo(std.name);
if (nub==0) {
return new Integer(this.age).compareTo(std.age);
}
return 1;
}
}
复制代码
作者:
吴海松
时间:
2015-1-2 23:40
你帮运行一下,告诉一下我结果?
作者:
雪落纷飞
时间:
2015-1-3 01:18
解释不通,等大神吧,只知道吧返回值改成nub没问题,为什么一面排会出现null也醉了
作者:
云兮丶
时间:
2015-1-3 09:16
:)看下最后一句的返回值。我感觉问题在那里
作者:
446111220
时间:
2015-1-3 10:20
学习一下
作者:
xiao飞
时间:
2015-1-3 10:45
学生类的,返回值应该是nub 不是 , 还是就是 集合加了泛型,你的Iterator 也要泛型 Set也必须要泛型 不然是不安全的, 泛型可以避免强转
作者:
hello_csu
时间:
2015-1-3 13:51
稍微Debug分析了一下子,其实存放的时候没有任何问题, 都存放到TreeMap中去了,但是在遍历的时候,发现出现了问题。因遍历的过程算法被
封装了,看不到。所以不知道他查找算法是怎么写的,但从我debug来看,个人认为也许其查找算法有瑕疵,考虑的不特别全面,导致特殊树型结构可能
没有被处理好。
目前暂时认为修改就是:compare函数中不要强制访问一个值,搞个极端的树,这个写法其实你根本就没有做什么排序处理。
public int compareTo(Object obj){
//System.out.println("zhi");
if (!(obj instanceof Student)) {
throw new RuntimeException("类型错误");
}
Student std=(Student)obj;
int nub=this.name.compareTo(std.name);
if (nub==0) {
return new Integer(this.age).compareTo(std.age);
}
return 1; --》<b>return nub</b>
}
复制代码
作者:
run_wind
时间:
2015-1-3 15:41
问你个问题啊,你为什么要实现comparable呢,是为了使元素具备比较性么?那你的目的如果是这个,为什么要固定返回1?返回nub不好么
作者:
小小志
时间:
2015-1-3 20:02
package Test3;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
public class Deno1111 {
public static void main(String[] agrs) {
TreeMap<Student,String> room2=new TreeMap<Student, String>();
/* room2.put(new Student("赵六",26),"广东");
room2.put(new Student("李四",20),"广西");
room2.put(new Student("王五",24),"广州");
room2.put(new Student("黄五",23),"上海");
room2.put(new Student("曾七",21),"北京");
room2.put(new Student("曾七",20),"北京"); */
room2.put(new Student("1",26),"广东");
room2.put(new Student("2",20),"广西");
room2.put(new Student("3",24),"广州");
room2.put(new Student("4",23),"上海");
room2.put(new Student("5",21),"北京");
room2.put(new Student("5",20),"北京");
get(room2);
}
public static void get(TreeMap<Student,String> t){//获取集合元素,打印方法
Set<Student> s=t.keySet();
Iterator<Student> it=s.iterator();
while(it.hasNext()){
Student key=(Student)it.next();
String value=(String)t.get(key);
System.out.println(key.name+":"+key.age+"="+value);
}
}
}
class Student implements Comparable<Student>
{//学生类
String name;
int age;
Student(String name,int age){
this.name=name;
this.age=age;
}
@Override
public int compareTo(Student obj) {
// TODO Auto-generated method stub
if (!(obj instanceof Student)) {
throw new RuntimeException("类型错误");
}
Student std=(Student)obj;
int nub=this.name.compareTo(std.name);
return nub==0?new Integer(this.age).compareTo(std.age):nub;
}
}
复制代码
你这样试试就知道哪错了 ? 你的比较方法怎么看着都别扭
作者:
红楼
时间:
2015-1-3 21:49
都好厉害啊
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2