JAVA中的集合与排序
一:常见的集合类
Collection接口 和 Map接口
Collection
①:collection是最常见的集合的上级接口。
②:继承自collection的常用接口有List,Set,都是单列的集合。
----在List下面的集合实现类主要有 Arraylist,LinkedList
----在Set下面的主要实现类有 HashSet,TreeSet
List和Set的特性和区别:
①:首先list和set都是单列集合;
②:list里面的元素是有序的可重复的;
③:set集合里面的元素是无序的不可重复的;
④:list集合可以根据下标获取对应的元素,而set则只能遍历全部集合才能获取对应的元素;
Set:
boolean
|
add(E o) 如果 set 中尚未存在指定的元素,则添加此元素(可选操作)。 |
|
boolean
|
addAll(Collection<? extends E> c) 如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中(可选操作)。 |
|
void
|
clear() 移除 set 中的所有元素(可选操作)。 |
|
boolean
|
contains(Object o) 如果 set 包含指定的元素,则返回 true。 |
|
boolean
|
containsAll(Collection<?> c) 如果此 set 包含指定 collection 的所有元素,则返回 true。 |
|
boolean
|
equals(Object o) 比较指定对象与此 set 的相等性。 |
|
int
|
hashCode() 返回 set 的哈希码值。 |
|
boolean
|
isEmpty() 如果 set 不包含元素,则返回 true。 |
|
Iterator<E>
|
iterator() 返回在此 set 中的元素上进行迭代的迭代器。 |
|
boolean
|
remove(Object o) 如果 set 中存在指定的元素,则将其移除(可选操作)。 |
|
boolean
|
removeAll(Collection<?> c) 移除 set 中那些包含在指定 collection 中的元素(可选操作)。 |
|
boolean
|
retainAll(Collection<?> c) 仅保留 set 中那些包含在指定 collection 中的元素(可选操作)。 |
|
int
|
size() 返回 set 中的元素数(其容量)。 |
|
Object[]
|
toArray() 返回一个包含 set 中所有元素的数组。 |
|
|
toArray(T[] a) 返回一个包含 set 中所有元素的数组;返回数组的运行时类型是指定数组的类型。 |
1 package collections; 2 3 import java.util.Set; 4 import java.util.TreeSet; 5 6 public class Sets { 7 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub 10 Set<Integer> s=new TreeSet<Integer>(); 11 s.add(1); 12 s.add(5); 13 s.add(6); 14 s.add(8); 15 s.add(2); 16 s.add(4); 17 System.out.println(s.toString()); 18 } 19 }
输出的结果为:
可见,当存储的数据为int类型的时候,treeset是可以自动进行排序的;
那么char类型的呢?????
1 package collections; 2 3 import java.util.Set; 4 import java.util.TreeSet; 5 6 public class Sets { 7 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub 10 Set<Character> s=new TreeSet<Character>(); 11 s.add('a'); 12 s.add('g'); 13 s.add('e'); 14 s.add('b'); 15 s.add('c'); 16 s.add('d'); 17 System.out.println(s.toString()); 18 } 19 }
可见这是按照字母的顺序去排列的;
那如果是一个不一样的String呢????
1 package collections; 2 3 import java.util.Set; 4 import java.util.TreeSet; 5 6 public class Sets { 7 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub 10 Set<String> s=new TreeSet<String>(); 11 s.add("a"); 12 s.add("g"); 13 s.add("k"); 14 s.add("b"); 15 s.add("c"); 16 s.add("d"); 17 System.out.println(s.toString()); 18 } 19 }
可见对于String类型来说,也是按照字母的顺序来排列的;
那如果对象里面存放的是一个对象,那该如何进行排序???????????????????????????????????
我么直接存放一个对象,代码如下:
1 package collections; 2 3 import java.util.Set; 4 import java.util.TreeSet; 5 6 public class Sets { 7 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub 10 Set<Student> s=new TreeSet<Student>(); 11 s.add(new Student(12,"zz")); 12 s.add(new Student(15,"aa")); 13 s.add(new Student(11,"bb")); 14 s.add(new Student(1,"kk")); 15 s.add(new Student(7,"gg")); 16 for (Student student : s) { 17 System.out.println(student.age+"----"+student.name); 18 } 19 } 20 }
你们猜一下运行的结果是什么?????
答案是:
报错,
因为对于一个对象来说,我们没有什么直观的条件去比较,上面报错也说了不能比较这个student对象,那我们该怎么办??????
当然是重写Comparable的比较方法啦,代码如下:
1 package collections; 2 3 public class Student implements Comparable<Student>{ 4 public int age; 5 public String name; 6 public Student(int age, String name) { 7 super(); 8 this.age = age; 9 this.name = name; 10 } 11 @Override 12 public int compareTo(Student o) { 13 // TODO Auto-generated method stub 14 return this.age-o.age; 15 } 16 }
我们在student对象上实现Comparable接口,重写里面的比较方法,这写的是按照年龄age去正序比较 运行结果如下
如果想比较里面的 名字,或者按照倒序排列,反过来写就好了,你们可以试一试;
-----------------------------------------------------------------------------------------------------------------------------------挫挫的分割线,,,下面开始说List----------------------------------------------------------------------------------------------------------------------------------------------
List
List
接口继承了 Collection
接口以定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
常用的方法如下:
boolean
|
add(E o) 向列表的尾部追加指定的元素(可选操作)。 |
|
void
|
add(int index, E element) 在列表的指定位置插入指定元素(可选操作)。 |
|
boolean
|
addAll(Collection<? extends E> c) 追加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序(可选操作)。 |
|
boolean
|
addAll(int index, Collection<? extends E> c) 将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。 |
|
void
|
clear() 从列表中移除所有元素(可选操作)。 |
|
boolean
|
contains(Object o) 如果列表包含指定的元素,则返回 true。 |
|
boolean
|
containsAll(Collection<?> c) 如果列表包含指定 collection 的所有元素,则返回 true。 |
|
boolean
|
equals(Object o) 比较指定的对象与列表是否相等。 |
|
E
|
get(int index) 返回列表中指定位置的元素。 |
|
int
|
hashCode() 返回列表的哈希码值。 |
|
int
|
indexOf(Object o) 返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回 -1。 |
|
boolean
|
isEmpty() 如果列表不包含元素,则返回 true。 |
|
Iterator<E>
|
iterator() 返回以正确顺序在列表的元素上进行迭代的迭代器。 |
|
int
|
lastIndexOf(Object o) 返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回 -1。 |
|
ListIterator<E>
|
listIterator() 返回列表中元素的列表迭代器(以正确的顺序)。 |
|
ListIterator<E>
|
listIterator(int index) 返回列表中元素的列表迭代器(以正确的顺序),从列表的指定位置开始。 |
|
E
|
remove(int index) 移除列表中指定位置的元素(可选操作)。 |
|
boolean
|
remove(Object o) 移除列表中出现的首个指定元素(可选操作)。 |
|
boolean
|
removeAll(Collection<?> c) 从列表中移除指定 collection 中包含的所有元素(可选操作)。 |
|
boolean
|
retainAll(Collection<?> c) 仅在列表中保留指定 collection 中所包含的元素(可选操作)。 |
|
E
|
set(int index, E element) 用指定元素替换列表中指定位置的元素(可选操作)。 |
|
int
|
size() 返回列表中的元素数。 |
|
List<E>
|
subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。 |
|
Object[]
|
toArray() 返回以正确顺序包含列表中的所有元素的数组。 |
|
|
toArray(T[] a) 返回以正确顺序包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。 |
实现list的两个常用的集合有 ayyarlist linkedlist
arraylist 与linkedlist的区别
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList遍历全部再确定。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
总结:::::::::::::::::::::::::::::::::::
Collection是集合接口
|————Set子接口:无序,不允许重复。
|————List子接口:有序,可以有重复元素。
区别:Collections是集合类
Set和List对比:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
Set和List具体子类:
Set
|————HashSet:以哈希表的形式存放元素,插入删除速度很快。
List
|————ArrayList:动态数组
|————LinkedList:链表、队列、堆栈。
------------------------------------------------------------------------------------------------挫挫的分割线,,,下面开始说Map---------------------------------------------------------------------------------------------------------
map:
实现Map集合的 常用的主要有 HashMap 类和 TreeMap 类
Map 有以下特点:
- 没有重复的 key
- 每个 key 只能对应一个 value, 多个 key 可以对应一个 value
- key,value 都可以是任何引用类型的数据,包括 null
- Map 取代了古老的 Dictionary 抽象类
里面的主要方法:
hashmap我们基本天天用就不说了-------->>>>>>>>可看博客为:http://blog.csdn.net/zhangqj_/article/details/53486115
主要说一下treemap的排序:
如果只是实现Comparator的隐藏类进行排序,只能按照key去排序,但是这样的话远远不能满足我们的需求,还是按照value去排序的比较多,那么我们可以让其先转化为list集合再利用sort方法进行排序;
代码如下:
1 package collections; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.Comparator; 6 import java.util.List; 7 import java.util.Map; 8 import java.util.Map.Entry; 9 import java.util.TreeMap; 10 public class Sets { 11 12 public static void main(String[] args) { 13 Map<String , Integer> map=new TreeMap<String, Integer>();//传建一个treemap 14 map.put("aa", 1); 15 map.put("ee", 4); 16 map.put("kk", 3); 17 map.put("pp", 8); 18 map.put("qq", 2); 19 //把treemap转换为list集合利用sort排序 20 List<Map.Entry<String, Integer>> list=new ArrayList<Map.Entry<String,Integer>>(map.entrySet()); 21 Collections.sort(list,new Comparator<Map.Entry<String, Integer>>() { 22 @Override 23 public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 24 // TODO Auto-generated method stub 25 /*if(o1.getValue()==o2.getValue()){ 26 return 0; 27 }else if(o1.getValue()==o2.getValue()){ 28 return -1; 29 }else{ 30 return 1; 31 }*/ 32 return o2.getValue()-o1.getValue();//倒序 33 } 34 }); 35 for (Entry<String, Integer> entry : list) { 36 System.out.println(entry.getKey()+"---"+entry.getValue()); 37 } 38 } 39 }
运行结果:
很明显,集合已经按照倒序排列了,如果要正序可以该表写法,当然也能利用key进行排序,使用key去compare就好了;
欢迎大家一起说出自己的想法。
JAVA中的集合与排序相关推荐
- 万字长文深入理解java中的集合-附PDF下载
文章目录 1. 前言 2. List 2.1 fail-safe fail-fast知多少 2.1.1 Fail-fast Iterator 2.1.2 Fail-fast 的原理 2.1.3 Fai ...
- (转)java中对集合对象list的几种循环访问总结
Java集合的Stack.Queue.Map的遍历 在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一些讲 ...
- java中如何对对象排序?
大家好,我是雄雄. 前言: 我们知道,在平时做项目的过程中,我们总会用到各种各样的排序,或是升序,或是降序.在java中,要实现排序有好多中方式,比如我们耳熟能详的冒泡排序.选择排序等,但是我们一般都 ...
- java中各种集合的用法和比较
一,java中各种集合的关系图 Collection 接口的接口 对象的集合 ├ List 子接口 按进入先后有序保存 可重复 │├ L ...
- java中的集合_Java 集合介绍,常用集合类
JAVA 集合 在处理数据的过程中经常会需要一个容器来存储某一类型的数据,Java 中的数组就是这样一种容器.但 Java 中的数组有其局限性,定义后的数组长度不可变,超出数组长度后就不能再存放数据了 ...
- java 中的集合_JAVA中的集合
JAVA中集合,是java中的基础概念,今天接着跟讲课准备课件的机会,重新整理一下关于JAVA中的集合的概念. 集合的概念 java中的集合类是用来存放对象的 集合相当于一个容器,里面包容着一组对象- ...
- 10.JAVA中的集合(数据结构)
Java中的集合 包含以下结构: 数组-线性表 链表 栈 队列 散列表 二叉树 映射关系(key-value) List集合 特点:[有序.重复] [线性表--数组] ArrayList 定义 线程 ...
- Java中哪些集合是有序的?
Java中哪些集合是有序的? 实现了 List 接口的集合类全部有序:比如ArrayList.LinkedList LinkedHashMap:在 HashMap 的基础上多维护了一个双向链表. Co ...
- Java中的集合多线程的理解
Java中的集合 1.List.Set和Queue [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DwpgIu9t-1587300088779)(file:///C:\ ...
最新文章
- 读书笔记 《Perl语言入门》 Day 1
- Spark DataFrame 添加自增id
- python知识点博客园_python零碎知识点一
- [转载]如何编写无法维护的代码(3)
- poj 2777(线段树的节点更新策略)
- mysql-安装包模式的安装过程-旧版
- 搞懂webdriver的底层原理,才敢说自己懂自动化!
- 解决微信小程序Video 某些属性设置不起作用问题
- 同事1000行又臭又长 的类!被我用IDEA几分钟重构!真香!
- 南佛罗里达大学计算机科学硕士,南佛罗里达大学计算机工程硕士排名第88(2020年TFE Times排名)...
- Vue 中使用Echarts构建3D地球
- 免费的PDF在线合并工具,拿走不谢!
- 『Excel』常用五大类函数汇总
- (无美国卡)如何进行美国号码是否可正常接收短信的验证,解决方案详见内文...
- Android-Handle详解
- vscode使用vetur解决代码换行、格式化、常量问题
- 群晖监控备份方案,为金融企业信息安全保驾护航
- 教你快速高效接入SDK——Unity统一接入渠道SDK(Android篇)
- Python之解决”千年虫“问题篇
- 美团王兴开炮阿里,昨天刚刚结束的美团四面面经分享,已拿Offer