黑马程序员技术交流社区
标题:
关于HashCode()的还有compareTo()的问题,高手来啊。
[打印本页]
作者:
孙浩迪
时间:
2012-6-14 01:32
标题:
关于HashCode()的还有compareTo()的问题,高手来啊。
package day1;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapTest {
public static void main(String[] args) {
Map<Person,String> map = new HashMap<Person, String>();
map.put(new Person("zhangsan",22), "beijing");
map.put(new Person("lisi",28), "shanghai");
map.put(new Person("wangwu",31), "tianjin");
map.put(new Person("dasha",37), "heilongjiang");
Set<Person> me = map.keySet();
for( Iterator<Person> it = me.iterator();it.hasNext();){
Person s=it.next();
String value= map.get(s);
System.out.println(s.getName()+"......"+s.getAge()+"............"+value);
}
Set<Map.Entry<Person, String>> iter = map.entrySet();
Iterator<Map.Entry<Person, String>> em=iter.iterator();
while(em.hasNext()){
Map.Entry<Person, String> m=em.next();
Person pe= m.getKey();
String s = m.getValue();
System.out.println(s+"........................."+pe.getName()+"........."+pe.getAge());
}
}
}
class Person implements Comparable<Person>{
private String name ;
private int age;
public Person(String name ,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() { //这里是比较的什么啊,, 不太明白, 如果属性比较多的话,该怎么比较,age*34是什么意思?
return name.hashCode()+age*34;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Person))
throw new ClassCastException("类型转换异常");
Person p= (Person) obj;
return this.name.equals(p.name) && this.age== p.age;
}
@Override
public int compareTo(Person o) { // 还有这里,我明明排序了, 为啥不是按年龄排序的。 如果该从小到大,这该怎么写。
int num= new Integer(this.age).compareTo(new Integer(o.age));
if(num==0)
return this.name.compareTo(o.name);
return num;
}
}
作者:
赵兵锋
时间:
2012-6-14 04:44
本帖最后由 赵兵锋 于 2012-6-14 04:45 编辑
public class Main {
public static void main(String[] args) {
Map<Person, String> map = new HashMap<Person, String>();
map.put(new Person("zhangsan", 22), "beijing");
map.put(new Person("lisi", 28), "shanghai");
map.put(new Person("wangwu", 31), "tianjin");
map.put(new Person("dasha", 37), "heilongjiang");
Set<Person> me = map.keySet();
for (Iterator<Person> it = me.iterator(); it.hasNext();) {
Person s = it.next();
String value = map.get(s);
System.out.println(s.getName() + "......" + s.getAge()+ "............" + value);
}
Set<Map.Entry<Person, String>> iter = map.entrySet();
Iterator<Map.Entry<Person, String>> em = iter.iterator();
while (em.hasNext()) {
Map.Entry<Person, String> m = em.next();
Person pe = m.getKey();
String s = m.getValue();
System.out.println(s + "........................." + pe.getName()+ "........." + pe.getAge());
}
<font color="Red"> Person[] ps = new Person[me.size()];//注意从这里开始,我加的用于排序的
ps = me.toArray(ps);
Arrays.sort(ps);
System.out.println(Arrays.asList(ps));//使用Person里的compareTo进行比较</font>
}
}
class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
<font color="Red"> public int hashCode() { //这里不是在比较,这是在计算此对象的哈希码,至于此方法有什么用,请看张孝祥老师的高新技术26
return name.hashCode() + age * 34;
}</font>
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Person))
throw new ClassCastException("类型转换异常");
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age;
}
<font color="Red"> @Override
public int compareTo(Person o) { //这是我修改后的,你要明白什么时候分别返回正、负、零
if (this.getAge() > o.getAge()) {
return 1;
} else if (this.getAge() == o.getAge()) {
return 0;
} else {
return -1;
}
}</font>
}
复制代码
作者:
晏文根
时间:
2012-6-14 07:56
赵兵锋 发表于 2012-6-14 04:44
package day1;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapTest {
public static void main(String[] args) {
Map<Person,String> map = new HashMap<Person, String>();
map.put(new Person("zhangsan",22), "beijing");
map.put(new Person("lisi",28), "shanghai");
map.put(new Person("wangwu",31), "tianjin");
map.put(new Person("dasha",37), "heilongjiang");
Set<Person> me = map.keySet();
for( Iterator<Person> it = me.iterator();it.hasNext();){
Person s=it.next();
String value= map.get(s);
System.out.println(s.getName()+"......"+s.getAge()+"............"+value);
}
Set<Map.Entry<Person, String>> iter = map.entrySet();
Iterator<Map.Entry<Person, String>> em=iter.iterator();
while(em.hasNext()){
Map.Entry<Person, String> m=em.next();
Person pe= m.getKey();
String s = m.getValue();
System.out.println(s+"........................."+pe.getName()+"........."+pe.getAge());
}
}
}
class Person implements Comparable<Person>{
private String name ;
private int age;
public Person(String name ,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() { //
这里是重写了hashCode,这是为了维护hashCode方法的常规规定,声明相等对象必须具有相等的散列吗,可以简单地说是为你重写equals做准备
return name.hashCode()+age*34;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Person))
throw new ClassCastException("类型转换异常");
Person p= (Person) obj;
return this.name.equals(p.name) && this.age== p.age;
}
public int compareTo(Person o) {
/*
还有这里,我明明排序了, 为啥不是按年龄排序的。 如果该从小到大,这该怎么写。
int num= new Integer(this.age).compareTo(new Integer(o.age));
if(num==0)
return this.name.compareTo(o.name);//
如果要从大到小,只要改变this与传入值的位置。
return num;*/
int num=this.age>o.age;
if(num==0)
return this.name.compareTo(o.name);
return num;
}
作者:
马东华
时间:
2012-6-14 08:48
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
public class MapTest {
public static void main(String[] args) {
Map<Person,String> map = new HashMap<Person, String>();
map.put(new Person("zhangsan",22), "beijing");
map.put(new Person("lisi",28), "shanghai");
map.put(new Person("wangwu",31), "tianjin");
map.put(new Person("dasha",37), "heilongjiang");
Set<Person> me = map.keySet();
TreeSet<Person> ts=new TreeSet<Person>(me);
Iterator<Person> it=ts.iterator();
while(it.hasNext())
{
Person p=it.next();
String str=map.get(p);
System.out.println(p+"..."+str);
}
}
}
class Person implements Comparable<Person>{
private String name ;
private int age;
public Person(String name ,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() { //这里获取的hashcode的值,age*34,只是设置一个值,可以是任意的数,你可以自由支配
return name.hashCode()+age*34;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Person))
throw new ClassCastException("类型转换异常");
Person p= (Person) obj;
return this.name.equals(p.name) && this.age== p.age;
}
@Override
public int compareTo(Person o) { // 这个是实现Comparable接口,加入你自己想要比较的内容,自然顺序是abc,123,如果你想颠倒,把返回值颠倒就行了。
int num= new Integer(this.age).compareTo(new Integer(o.age));
if(num==0)
return this.name.compareTo(o.name);
return num;
}
}
复制代码
hashmap不能排序,你要想排序的话,必须自己编写程序进行排序,上面是我的排序
作者:
揭耀祖
时间:
2012-6-14 11:04
首先我要说的是,楼上各位讲的似乎都有点不太着调,因为首先要存入的是一个HashMap集合,所以person这个类继承comparable后,复不复写compareTo()这个方法都没关系,因为person存入HashMap集合中根本不会调用compareTo()这个方法,而是调用hashCode()方法计算出hash值后进行排序。
而equals()方法是用来比较两个对象是否相等的,只有在你存入的两个person对象的hash值相同时,才会调用一次equals()方法,如果存入的person对象的hash值都不相同,那么连一次equals()方法都不会调用,你只要记住hashCade()是用来计算hash值的,每个元素存入HashMap中时都会度调用一次它。
而如果person对象是存入TreeMap集合中的话,那么这时才会调查用compareTo()方法进行比较,而如果你在定义TreeMap时传入了比较器,这个时候就不调用compareTo()方法了,而是优先调用比较器的compare()方法来进行比较。
说了这么多,希望能帮到你。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2