您的位置:首页 > 其它

集合框架(ArrayList去重复)和 (Hashset和Treeset的结构特点)

2019-05-22 00:04 225 查看

集合框架

集合框架ArrayList中的重复元素去重及其底层原理
判断list 集合中元素是否相同,原理是arrayList调用Contains()的方法,当调用Contains()方法时会自动调用它的底层equals()的方法,我们要将原有的集合遍历,再将遍历后的元素存放到新的集合中,存放前做一个判断,再重写equals()的方法。

package com.wangshoyang.collection;

import java.util.ArrayList;
import java.util.Iterator;

import sun.net.www.content.text.plain;

public class ListDemo2 {
public static void main(String[] args) {
ArrayList list = new ArrayList<>(70);

list.add(new Person("lll",17));
list.add(new Person("xxxx",19));
list.add(new Person("dddd",45));
list.add(new Person("wsy",21));
list.add(new Person("lll",17));

// System.out.println(list.size());

ArrayList singleList=singleList(list);
Iterator it=singleList.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}

public String toString() {
return super.toString();
}

/**
* 思路
* 将原有的集合遍历
*遍历后元素放到新的集合中
*存放前做一个字符串的判断
*
*java.lang.String是不是被重写过?
* @param list
* @return
*/

private static ArrayList singleList(ArrayList list) {
ArrayList newAl=new ArrayList<>();
Iterator it=list.iterator();
while(it.hasNext()) {
Object obj=it.next();
if(!newAl.contains(obj)) {
newAl.add(obj);
}
}
return newAl;
}

}
class Person {
private String name;
private int age;

public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
4000

}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
public boolean equals(Object obj) {
if(obj instanceof Person) {
Person p=(Person) obj;
System.out.println(this.getName()+"equlas" +p.getName());
return this.getName().equals(p.getName())&&this.getAge()==p.getAge();
}
return false;
}
public String toString() {
return "Person [name="+name+",age="+age+"]";
}

}
这样我们可以看到加入的两个lll只有一个出来了

Set集合
set集合可以存储多个对象,但并不会记住元素的存储顺序,也不允许集合中有重复元素(不同的set集合有不同的判断方法)。

1、HashSet
HashSet的特点:数据结构是哈希表、元素是无序(存入和取出的顺序不一定一致),字符串元素不可以重复;

探究HashSet判断元素重复问题
原理:利用HashSet调用add方法的同时底层会自动调用HashCode()和equals()方法,重写两个方法,HashCode()比较的是内存地址,equals()比较的是元素内容

package com.wangshoyang.collection.set;
import java.util.HashSet;
import java.util.Iterator;

/**

  • hashset本身具备去重复的功能 那么需要奥探究HashSet为什么能够去重复 它依靠的是啥?
  • @author wsy

*/

public class HashSetDemo {
public static void main(String[] args) {
HashSet hs = new HashSet();

hs.add(new Person("QAQA",123));
hs.add(new Person("AAA",13));
hs.add(new Person("BBB",15));
hs.add(new Person("QQWQ",88));
hs.add(new Person("QAQA",123));

Iterator it = hs.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}

}

class Person {
private String name;
private int 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;
}

public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}

/**
* 返回值代表容器中具体的位置的坐标
*/
public int hashCode() {
return this.getName().hashCode() + this.age;
}

public Person() {
super();
}

public boolean equals(Object obj) {
if (obj instanceof Person) {
Person p = (Person) obj;
System.out.println(this.getName() + "equlas" + p.getName());
return this.getName().equals(p.getName()) && this.getAge() == p.getAge();
}
return false;
}

public String toString() {
return "Person1 [name=" + name + ",age=" + age + "]";
}
public int compareTo(Person o) {
int num=this.getAge() - o.getAge();
if(num==0) {
return this.getName().compareTo(o.getName());
}
return num;
}

}
这样我们就可以得出只有一个QAQA了

2、集合框架TreeSet
2.1、TreeSet自然排序
TreeSet可以对set集合中元素进行排序,String实现了Comparable接口,所以可以直接进行排序,引用数据类型想要排序,必须实现Comparable接口,其他引用数据类型没有实现Comparable接口,那么会出现java.lang.ClassCastException: com.javaxl.Peroon cannot be cast to java.lang.Comparable,实现引用数据类型实现此接口就没问题了。注意:排序时,当主要条件相同时,一定要判断次要条件。

TreeSet是SortedSet接口的实现类,TreeSet可以保证了集合元素处于排序状态(所谓排序状态,就是元素按照一定的规则排序,比如升序排列,降序排列)。
与HashSet集合相比。
Comparator comparator():如果TreeSet采用了定制排序,则该方法返回定制排序所使用的Comparator,如果采用了自然排序,则返回null。
Object first(): 返回集合中的第一个元素。
Object last():返回集合中的最后一个元素。
Object lower(Object e):返回集合中位于指定元素e之前的元素(即小于指定元素的最大元素,参考元素e不必是集合中的元素)。
Object higher(Object e): 返回集合中位于指定元素e之后的元素(即大于指定元素的最小元素,参考元素e不必是集合中的元素)。
SortedSet subSet(Object fromElement, Object toElement): 返回集合中所有在fromElemt和toElement之间的元素(包含fromElent本身,不包含toElement本身)。
SortedSet headSet(Object toElement): 返回此set的子集,由小于toElement的元素组成。
SortedSet tailSet(Object fromElement):返回此set的子集,由大于或等于fromElement的元素组成。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐