A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘海东 中级黑马   /  2013-6-3 10:19  /  2138 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘海东 于 2013-6-3 20:49 编辑

/*
*将自定义对象作为元素
*并取出相同元素,重复元素
*如:存储人对象
*同姓名同年龄视为同一个人,为同一元素
*思路:
*1、对人进行描述,将数据封装进人对象
*2、定义容器,将人存入
*3、取出*/
package cn.itcast.day14;
import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListTest2 {
public static void main(String[] args) {
  ArrayList<Person> al = new ArrayList<Person>();
  al.add(new Person("lisi01", 21));
  al.add(new Person("lisi02", 22));
  al.add(new Person("lisi02", 22));
  ArrayList<Person> al2 = singleElements(al);// 调用这个方法之后,本应该去除重复元素
  for (Iterator<Person> it = al2.iterator(); it.hasNext();) {
   Person temp = it.next();
   System.out.println(temp.getName() + "..." + temp.getAge());// 迭代器:打印元素
  }
}
public static ArrayList<Person> singleElements(ArrayList<Person> al) {
  ArrayList<Person> newAl = new ArrayList<Person>(); // 这个方法 作用是 去除重复元素
  for (Iterator<Person> it = al.iterator(); it.hasNext();) {
   Person p = it.next();
  if (!newAl.contains(p)) {//这个contians()方法不是应该调用Person类中重写之后的equals方法吗?
    newAl.add(p);
   }
  }
  return newAl;
}
}
class Person {
private String name;
private int age;
Person(String name, int age) {
  this.name = name;
  this.age = age;
}
public String getName() {
  return name;
}
public int getAge() {
  return age;
}
public boolean equals(Person p) {
System.out.println(this.name + "......" + p.name);// 这句话没有执行,说明没有调用这个equals方法
  return this.name.equals(p.name) && this.age == p.age;// 这句话里面的equals是字符串里面的equals方法
}
}

这里我是直接用myEclipse 写的。写好之后运行发现不能去除重复元素
然后我换用cmd,编译可以通过,运行时报Exception in thread "main" java.lang.NoClassDefFoundError: ArrayListTest2
这个又是为什么?

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

5 个回复

倒序浏览
学习学习!
回复 使用道具 举报
编译可以通过,运行时报Exception in thread "main" java.lang.NoClassDefFoundError: ArrayListTest2
这个又是为什么 ?
建议楼主查看一下  .java 的文件名 是否和  public class  @@   这里的class名是一致的   

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
问题出在这
public boolean equals(Person p) {
System.out.println(this.name + "......" + p.name);// 这句话没有执行,说明没有调用这个equals方法
  return this.name.equals(p.name) && this.age == p.age;// 这句话里面的equals是字符串里面的equals方法
}
}

你这个方法没有复写equals方法
这个是正确的
public boolean equals(Object obj) //类型必须是Object 类型
{
        if(!(obj instanceof Person))//判断person是不是obj引用的实例,不是直接结束
                return false;

        Person p = (Person)obj;//然后强转为person类型
        System.out.println(this.name + "......" + p.name);// 这句话没有执行,说明没有调用这个equals方法
        return this.name.equals(p.name) && this.age == p.age;// 这句话里面的equals是字符串里面的equals方法
}

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
应该调用的是容器的比较器吧
回复 使用道具 举报
楼主只要把你的equals稍微改一下就OK

改成这样的:
  1.         @Override
  2.         public boolean equals(Object obj) {
  3.                 // TODO Auto-generated method stub
  4.                 if(!(obj instanceof Person))
  5.                         return false;
  6.                 else{
  7.                         Person p = (Person)obj;
  8.                         return this.name.equals(p.name) && this.age == p.age;
  9.                 }
  10.         }
复制代码
关于: 运行时报Exception in thread "main" java.lang.NoClassDefFoundError: ArrayListTest2
这个又是为什么?

肯定是因为你javac的文件有包,但是 你的java 却没有包

就是你编译的文件有Packge,运行时也要求有包名

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马