java提供的Arraylist本身不能对添加的元素进行去重,需要在添加后进行比较,如果相同就不添加
public static ArrayList single(ArrayList al) {
ArrayList temp = new ArrayList();
Iterator it = al.iterator();
while(it.hasNext()){
Object obj = it.next();
if(!temp.contains(obj)){ //如果元素已经存在就不添加 确保不重复
temp.add(obj);
}
}
return temp;
}
java里Hashset默认可以自动对字符型等简单对象进行去重复,如
public static void main(String[] args) {
HashSet hs = new HashSet();
hs.add("hehe");
hs.add("xixii");
hs.add("hehe");
Iterator it = hs.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
HashSet判断是否重复时,先判断HashCode是否一样,两个对象hashcode不相等,他们一定不equals。两个对象hashcode相等,他们不一定equals,还需要进一步判断。再重写equals方法,步骤
1. 判断传入的对象是否为空,如果为空,没有比较的必要 返回false
2. 判断当前对象是否和传入对象是同一个对象,如果是一个对象,没有必要比较,返回true
3. 判断当前对象是否和传入的对象类型相同,如果不同,没有比较的意义 返回false
4. 如果当前对象和传入对象类型相同(传入对象可以是相同或者子类),将传入的对象强制转换为当前对象类型
5. 逐个的来比较对象中的每一个属性值(对象的比较用equals()方法,基本类型用==,double,float 有精度损失的,可以将其转换成对应的Double,Float后在调用equals()进行比较)
public class Person {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return name.hashCode()+age*27; //不同对象产生不同的hashcode 不会调用equals提高效率
}
@Override
public boolean equals(Object obj) {
if(this == obj) //判断是否为同一个对象 是返回 true 证明已经存在
return true;
if(!(obj instanceof Person)) //不是同一对象 判断是否 隶属于 person类对象
throw new ClassCastException("类型错误"); //不是抛出异常
Person p = (Person)obj; //转换为 Person类型
return this.name.equals(p.name) && this.age == p.age; //返回 是否存在
}
}
排序有两种实现方式:comparable和Comparator
第一种 comparable 排序
TreeSet排序 实现comparable接口 只有TreeSet可以排序 HashSet不可以,所有的set都可以去重复
public class Person implements Comparable {
........
........
public int compareTo(Person p){
int temp = this.age - p.age; //按年龄排序
return temp==0?this.name.compareTo(p.name):temp; //年龄相同按姓名排序
}
}
例子
public static void main(String[] args) {
TreeSet ts = new TreeSet(); //TreeSet对象
ts.add(new Person("zhangsan",28));
ts.add(new Person("lisi",21));
ts.add(new Person("wangu",24));
ts.add(new Person("zangu",24));
Iterator it = ts.iterator();
while(it.hasNext()){
Person p = (Person)it.next();
System.out.println(p.getName()+":"+p.getAge());
}
}
先按年龄 相同年龄 再按姓名。
结果:lisi 21
wanggu 24
zangu 24
zhangsan 28
第2种 comparator排序
public class ComparatorByName implements Comparator {
@Override
public int compare(Object o1, Object o2) {
Person p1 = (Person)o1;
Person p2 = (Person)o2;
int temp = p1.getName().compareTo(p2.getName()); //先按姓名
return temp==0?p1.getAge()-p2.getAge(): temp; //再按年龄排
}
}
public static void main(String[] args) {
TreeSet ts = new TreeSet(new ComparatorByName());
ts.add(new Person("zhangsan",28));
ts.add(new Person("lisi",21));
ts.add(new Person("zangu",24));
ts.add(new Person("zangu",26));
Iterator it = ts.iterator();
while(it.hasNext()){
Person p = (Person)it.next();
System.out.println(p.getName()+":"+p.getAge());
}
}
结果:lisi 21
zangu 24
zangu 26
zhangsan 28
map键值对 遍历值的获取
entrySet可以直接获取 key和value keySet() 先获得key 然后通过get(key)获得value值
public static void method(Map map){
Map map = new HashMap();
map.put(8,"zhaoliu");
map.put(2,"zhaoliu");
map.put(7,"xiaoqiang");
map.put(6,"wangcai");
Collection values = map.values(); //获得value值
Iterator it2 = values.iterator();
while(it2.hasNext()){
System.out.println(it2.next());
}
Set> entrySet = map.entrySet(); //
Iterator> it = entrySet.iterator();
while(it.hasNext()){
Map.Entry me = it.next();
Integer key = me.getKey(); //获得key
String value = me.getValue(); //获得value
System.out.println(key+"::::"+value);
}
Set keySet = map.keySet();
Iterator it = keySet.iterator();
while(it.hasNext()){
Integer key = it.next();
String value = map.get(key);
System.out.println(key+":"+value);
}
}
HashMap 每个key 只有一个value 最后一次key的value会重新以前的value。
keySet实现HashMap遍历
public static void main(String[] args) {
HashMap hm = new HashMap();
hm.put(new Student("lisi",38),"北京");
hm.put(new Student("zhaoliu",24),"上海");
hm.put(new Student("zhaoliu",24),"铁岭");
Iterator it = hm.keySet().iterator();
while(it.hasNext()){
Student key = it.next(); //先得到key
String value = hm.get(key); //根据key获得value
System.out.println(key.getName()+":"+key.getAge()+"---"+value);
}
}
输出结果 lisi 38 北京
zhaoliu 24 铁岭 //替换了前面的 上海的那个
TreeMap也可以实现排列 Comparator,方式与TreeSet一样,这里就不介绍了