黑马程序员技术交流社区

标题: 求解答,一个关于list的问题 [打印本页]

作者: mengxiang1993    时间: 2015-2-1 07:59
标题: 求解答,一个关于list的问题

public static void main(String[] args) {
                Cat c1 = new Cat(6);
                Cat c2 = new Cat(8);
                List<Cat> list = new ArrayList<Cat>();
                list.add(c1);
                list.add(c2);
                for (int i = 0; i < list.size(); i++) {
                        System.out.println(list.get(i));

                }

                Collections.sort(list);
                System.out.println(list);

        }

}
输出结果
rank_cat.Cat@c17164
rank_cat.Cat@1fb8ee3
[rank_cat.Cat@c17164, rank_cat.Cat@1fb8ee3]

怎样才能输出c1,c2,对象名字呢?我知道应该重写toSting()方法,但怎样重写呢?



作者: 邓士林    时间: 2015-2-1 08:39
因为你添加的是自定义对象集合,所以要重写toString(),由于你的对象Cat只有一个int类型成员,所以你就不重写compareTo方法。然后你就排序,这样是不严格,你看下排序的说明。根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素都必须是可相互比较的(也就是说,对于列表中的任何 e1 和 e2 元素,e1.compareTo(e2) 不得抛出 ClassCastException)。
我改了下:

  1. import java.util.*;
  2. class Cat implements Comparable
  3. {
  4.         private String name;
  5.         private int age;
  6.         Cat(String name,int age)
  7.         {
  8.                 this.name = name;
  9.                 this.age = age;
  10.         }

  11.         public String toString()
  12.         {
  13.                 return this.name + "..." + this.age;
  14.         }

  15.         public int compareTo(Object obj)
  16.         {
  17.                 if(!(obj instanceof Cat))
  18.                         return -1;
  19.                 Cat cat = (Cat)obj;
  20.                 return this.name.compareTo(cat.name);
  21.         }
  22. }
  23. class  CatDemo
  24. {
  25.         public static void main(String[] args)
  26.         {
  27.                         Cat c1 = new Cat("a",6);
  28.                         Cat c2 = new Cat("b",8);
  29.                         List<Cat> list = new ArrayList<Cat>();
  30.                         list.add(c1);
  31.                         list.add(c2);
  32.                         for (int i = 0; i < list.size(); i++) {
  33.                                         System.out.println(list.get(i));
  34.                         }
  35.                         Collections.sort(list);
  36.                         System.out.println(list);
  37.         }
  38. }
复制代码





作者: 艺多不压身丶    时间: 2015-2-1 08:47
在对象里面定义获取方式就行
作者: 艺多不压身丶    时间: 2015-2-1 08:51
你集合泛型定义的是cat类型的,所以你add是添加不进去的。只能add(new Cat(c1));
作者: jwl245322883    时间: 2015-2-1 09:42
来看看学习一下
作者: d342784178    时间: 2015-2-1 09:50
对象名字就是类名加hash值啊
作者: 丨丶米饭    时间: 2015-2-1 10:15
如果你非得输出对象名c1,c2,不妨这么做

// Cat 类
class Cat{
  private String className;

  public Cat(String className){ // 有参构造,参数用于保存对象名
    this.className = className;
  }

  public String toString(){
    // 这个方法的意思是:System.out.println(当前对象),控制台打印当前对象的className变量的值
    return className;
  }

  // 直接在这里写个main方法测试下就行
  public static void main(String[] args){
    Cat c1 = new Cat("c1"); // 把对象名作为参数传进去
    Cat c2 = new Cat("c2");
    List<Cat> list = new ArrayList<Cat>();
      list.add(c1);
      list.add(c2);
      System.out.println(list); // 输出来的就是c1、c2 (程序,弄透了,就是视觉欺骗而已,你可以任意妄为)
  }
}
作者: mengxiang1993    时间: 2015-2-11 15:47
丨丶米饭 发表于 2015-2-1 10:15
如果你非得输出对象名c1,c2,不妨这么做

// Cat 类

谢谢,明白了




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