集合的整理,总结.案例代码()

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合的整理,总结.案例代码()相关的知识,希望对你有一定的参考价值。

集合重点整理:
collection<E>接口---list<E>接口和set<E>接口(线性集合)

List接口--------的实现类中主要学习了ArrayList. LinkedList. Vector. Stack(是Vector类的一个子类)类。
实现List接口的集合:总体上有序(针对元素插入的顺序),不排除重复

ArrayList---底层通过数组实现,适用于元素的修改和查找操作,
常用方法:add(). addAll(). clear(). contians(Objiec o). contiansAll(). get(int index)
indexOf(Object o). Iterator(). ListIterator(). isEmpty(). size(). suList()
remove(). removeAll(). retainAll(). set(int index,Object o). trimToSize()

LinkedList--底层通过链表实现,适用于元素的增加和删除操作,
除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名
方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
所以也有 peek() pop() push()方法 addFirst(), addLast(), getFirst(), getLast(), peek()
peekLast(), addFirst(), addLast(), removeFirst(), removeLast()

Stack-------创建一个空堆栈,常用方法: peek() pop() push()

实现List接口集合的遍历方式:
1:for循环(增强for循环)
2:Iterator()迭代器
3:listIterator() list的专属迭代器 允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器
在列表中的当前位置

 

Set接口-------------的实现类 HashSet . LinkedHashSet(是HashSet的子类). TreeSet
实现Set接口的集合:总体无序存储,排重.set 不包含满足e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个
null 元素

TreeSet-----实现Set接口的同时,也实现了SortedSet接口 进一步提供关于元素的总体排序 的 Set。这些元素使用其自然顺序
进行排序,或者根据通常在创建有序 set 时提供的 Comparator 进行排序。该 set 的迭代器将按元素升序遍历
set。提供了一些附加的操作来利用这种排序。(headSet(), subSet(), tailSet())

TreeSet集合的元素排序:
自然排序:自动调用Compareto方法,对元素升序排序.当然我们也可以实现Comparable接口重写
Compareto方法来按照我们想要的顺序来排序.(重写必须实现Comparable接口)
定制排序:实现Compartor接口,重写Compare方法.
创建 set 时提供的 Comparator 进行排序(使用匿名内部类,实现我们想要的排序)
构造方法中必须要传入一个比较器,不能使用无参构造
TreeSet<E> t = new TreeSet<>(comparator)
HashSet, LinkedHashSet(extends HashSet)区别不大. 如果要按照我们自己的条件排重,就必须重写equals()和hashCold()方法

 


Map接口-------------映射性集合,元素以键值对的形式存在(key=value;key:value)相对无序,整体排重(只对key进行排重)
put(k key,v value)具体方法查API;

HashMap, LinkedHashMap(extends HashMap) 排重,可以重写equals()和HashCold()方法来实现我们定义的排重效果

Hashtable, Properties(extends Hashtable) 不允许key,value为null

TreeMap 实现了Map接口,也实现了SortedMap接(口进一步提供关于键的总体排序 的 Map。该映射是根据其键的自然
顺序进行排序的,或者根据通常在创建有序映射时提供的 Comparator 进行排序)
排序只对key进行排序,和TreeSet集合相似, 1:实现Compartor接口,重写Compare方法
2:实现Comparable接口,重写Comparato方法
Map集合的遍历方式:
1: 通过keySet()方法,获取包含key的set视图,
然后遍历该set集合,得到所有的key,
通过get()方法获取value;
2: 通过entrySet()方法,得到包含映射关系的 Set 视图(Set<Map.Entry<k,v>>)
可以直接遍历该set集合,直接得到键值映射关系
也可以通过Map.Entry<k,v>接口中的getKey()和getValue()方法来分别获得键和值对;

 

 

下面有两个 案例  大家可以参考一下

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

import java.util.Comparator;

public class Student implements Comparator<Student>{          //这是一个简单的学生类  
    String name;
    int age;
    int score;
public Student(String name, int age, int score) {
    super();
     this.name = name;
    this.age = age;
    this.score = score;
}

public Student() {
    super();
}

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 int getScore() {

return score;
}
public void setScore(int score) {

this.score = score;
}
@Override
public String toString() {
return "学生 [名字=" + name + ", 年龄=" + age + ", 分数=" + score + "]";
}
@Override
public int compare(Student o1, Student o2) {      //重写compare方法   因为实现的是 Comparator接口 (定制排序)
if(o1.score-o2.score!=0){
return o1.score-o2.score;

}else {
if(o2.age-o1.age!=0){
return o2.age-o1.age;
}else{
if(o1.name.compareTo(o2.name)!=0){
return o1.name.compareTo(o2.name);
}else{
return 0;
}
}
}
}

}

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class TestStudent {                                 //测试类
public static void main(String[] args) {
      TreeSet<Student> t= new TreeSet<>(new Student());   //这里用TreeSet集合的有参数的构造方法  传入一个比较器进去  new Student()
        t.add(new Student("a", 18, 56));
        t.add(new Student("e", 12, 23));
        t.add(new Student("d", 15, 23));
        t.add(new Student("f", 11, 89));
        t.add(new Student("q", 18, 12));
        t.add(new Student("q", 1, 12));

        //System.out.println(t.size());
      Iterator<Student> s = t.iterator();
        while(s.hasNext()){
          System.out.println(s.next());
}

 


 TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {      //如果我们在Student类中 重写compare方法中 没有实现具体的代码  我们可以再这里传入一个匿名内部类的方式

@Override
public int compare(Student o1, Student o2) {
    if(o1.score-o2.score!=0){
      return o1.score-o2.score;
    }else if(o2.age-o1.age!=0){
      return o2.age-o1.age;
    }else{
      return o1.name.compareTo(o2.name);
  }
  }
  });                  //到这里 这条语句才结束   创建了一个TreeSet集合 里面传入了一个Comparetor 比较器
}
}

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

public class Student implements Comparable<Student>{
    String name;
    private int scores;
    private int age;
    private String sex;
    private int id;
    private int mathscore;
    private int chinesescore;
    private int engishscore;
    private int allscore;


public Student(String name, int scores, int age, String sex, int id, int mathscore, int chinesescore,
int engishscore, int allscore) {
      super();
      this.name = name;
      this.scores = scores;
      this.age = age;
      this.sex = sex;
      this.id = id;
      this.mathscore = mathscore;
      this.chinesescore = chinesescore;
      this.engishscore = engishscore;
      this.allscore = allscore;

}
@Override
public int compareTo(Student o) {              //自然排序 重写 compareTo方法,把每个属性都需要添加进去比较 才能给达到排重的功能  如果你另外去写equals和hashcode 是没法达到目的的

                   //就算重写了 这两个方法  在加入集合的时候 不会调用这两个方法排重  只会用到 compareTo方法
    if((o.getAllscore()+o.getChinesescore()+o.getEngishscore()+o.getMathscore())!=
      (this.allscore+this.chinesescore+this.engishscore+this.mathscore)){
        return (o.getAllscore()+o.getChinesescore()+o.getEngishscore()+o.getMathscore())-
            (this.allscore+this.chinesescore+this.engishscore+this.mathscore);
  }else if(this.allscore!=o.getAllscore()){
      return o.getAllscore()-this.allscore;
     }else if(this.mathscore!=o.getMathscore()){
        return o.getMathscore()-this.mathscore;
      }else if(this.engishscore!=o.getEngishscore()){
        return o.getEngishscore()-this.engishscore;
    }else if(o.getChinesescore()!=this.chinesescore){
        return o.getChinesescore()-this.chinesescore;
    }else if(!o.getName().equals(this.name)){
        return o.getName().compareTo(this.name);
    }else if(o.getAge()!=(this.age)){
      return o.getAge()-(this.age);
    }else{
      return o.getSex().compareTo(this.sex);
}
}

   //  这样写来为了实现排重 是没有任何意义的 
/*@Override                           
public boolean equals(Object obj) {
if(obj instanceof Student){
Student s = (Student) obj;
if(s.getName().equals(this.name)&&s.getAge()==this.age&&
s.getSex().equals(this.sex)&&s.getId()==this.id){
return true;
}
}
return false;
}
@Override
public int hashCode() {
return this.age+this.id+this.chinesescore+this.engishscore+this.mathscore
+this.allscore;
}*/

}

 




































































































































































































以上是关于集合的整理,总结.案例代码()的主要内容,如果未能解决你的问题,请参考以下文章

常见数据结构与算法整理总结(上)

常见数据结构与算法整理总结(上)

常见数据结构与算法整理总结(上)

java工具类学习整理——集合

如果天空不是集合框架阅读列表整理

常见数据结构与算法整理总结(上)