关于Java——集合框架listlambdasetmap遍历方法数据结构和java集合遍历的几种方法的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于2022-08-20:给定区间的范围[x
关于Java —— 集合框架 list lambda set map 遍历方法 数据结构和java集合遍历的几种方法的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于2022-08-20:给定区间的范围 [xi,yi],xi<=yi,且都是正整数, 找出一个坐标集合 set,set 中有若干个数字, set 要和每个给定的区间,有交集。 求 set 的最少需要几个数。 比如给、java List Set Map、java list,set,map,数组间的相互转换详解、Java List,List <?>,List
- Java —— 集合框架 list lambda set map 遍历方法 数据结构(java集合遍历的几种方法)
- 2022-08-20:给定区间的范围 [xi,yi],xi<=yi,且都是正整数, 找出一个坐标集合 set,set 中有若干个数字, set 要和每个给定的区间,有交集。 求 set 的最少需要几个数。 比如给
- java List Set Map
- java list,set,map,数组间的相互转换详解
- Java List,List <?>,List
,List 和List
Java —— 集合框架 list lambda set map 遍历方法 数据结构(java集合遍历的几种方法)
本节重点思维导图
集合框架
有序无序:元素放入的顺序与取出的顺序是否一致,一致即为有序,不一致即无序。
- List:允许重复、有序
- ArrayList:长度可变的数组,遍历速度快
- LinkedList:链表:添加删除节点速度快
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List list = new ArrayList();
System.out.println("--------"+list.toString());//add
list.add("aa");
list.add(1234);
list.add(true);
list.add(new Date());
list.add(1234);
list.add(3.14);
System.out.println(list.get(0) + " -- " + list.get(3));
System.out.println(list.size());
System.out.println(list);
System.out.println(list.toString());
for (Object obj : list) {
System.out.println(obj);
}
list.remove(0);// 根据下标移除
list.clear();
System.out.println(list.size());
}
}
结果:
--------[]
aa -- Fri May 31 15:07:45 CST 2019
6
[aa, 1234, true, Fri May 31 15:07:45 CST 2019, 1234, 3.14]
[aa, 1234, true, Fri May 31 15:07:45 CST 2019, 1234, 3.14]
aa
1234
true
Fri May 31 15:07:45 CST 2019
1234
3.14
0
泛型
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("1234");
list.add("true");
list.add("aaaa");
list.add("aaaa");
list.add("bbbb");
list.add("dddd");
String e3 = list.get(3);
System.out.println(e3);
System.out.println(list.get(3));
int size = list.size();
System.out.println(size);
for (String item : list) {
System.out.println(item);
}
System.out.println("--------------------------");
// Iterator迭代器
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {// 判断是否还有下一个元素,有的话返回true
String next = iterator.next();// 取出元素,同时将指针指向当前位置
System.out.println(next);
}
}
}
结果:
aaaa
aaaa
6
1234
true
aaaa
aaaa
bbbb
dddd
--------------------------
1234
true
aaaa
aaaa
bbbb
dddd
list\Lambda\set\map
*lambda
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("zhangsan");
list.add("lisi");
list.add("zhangsan");
list.add("wanger");
list.add("mazi");
list.add("wanger");
list.stream().forEach(element->System.out.println(element));
System.out.println();
list.forEach(item -> System.out.println(item));
System.out.println();
list.forEach(System.out::println);
//将List中所有的元素变成大写字母后再逆序输出
System.out.println();
for(int i =list.size()-1;i>=0;i--) {
String item = list.get(i);
item = item.toUpperCase();
System.out.println(item);
}
System.out.println();
list.stream().map(item->item.toUpperCase())//映射:依次拿出List中的每一个元素进行映射
.forEach(System.out::println);
//输出List中每一个元素的前两个字符
System.out.println();
list.stream().map(item->item.substring(0, 2))
.forEach(System.out::println);
//只输出List中长度大于4的元素
System.out.println();
list.stream().filter(item->item.length()>4)
.forEach(System.out::println);
//去除重复
System.out.println();
list.stream().distinct().forEach(System.out::println);
//将Stream转换成List
System.out.println();
List<String> collect = list.stream().collect(Collectors.toList());
System.out.println(collect);
}
*set
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("zhangsan");
set.add("lis");
set.add("zhangsan");
set.add("wanger");
set.add("mazi");
set.add("wanger");
for(String item : set) {
System.out.println(item);
}
System.out.println();
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println();
set.forEach(System.out::println);
}
示例:学习 set 判断元素是否相等
public class Dept {
private int deptno;
private String dname;
private String loc;
public Dept() {
super();
}
public Dept(int deptno, String dname, String loc) {
super();
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
@Override
public int hashCode() {
return 234;
}
@Override
public boolean equals(Object obj) {
return true;
}
@Override
public String toString() {
return "Dept [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc + "]";
}
}
public static void main(String[] args) {
Set<Dept> set = new HashSet<>();
set.add(new Dept());
set.add(new Dept());
set.add(new Dept(10,"sales","new york"));
set.add(new Dept(20,"research","chicago"));
System.out.println(set.size());
set.forEach(System.out::println);
}
*map
键值对
public static void main(String[] args) {
Map<String, Integer> data = new HashMap<>();
data.put("a", 1);
data.put("b", 2);
data.put("c", 3);
data.put("d", 4);
System.out.println(data.get("a"));
Set<String> keySet = data.keySet();
keySet.forEach(System.out::println);
Collection<Integer> values = data.values();
values.forEach(item->System.out.print(item+" "));
System.out.println();
Set<Entry<String, Integer>> entrySet = data.entrySet();
for(Entry<String, Integer> item: entrySet) {
System.out.println(item.getKey()+" "+item.getValue());
}
data.forEach((k,v)->System.out.println(k+" : "+v));;
}
遍历方法
快捷键:
代码格式化:ctrl+sfhit+f
自动提示:alt+?
抽取变量:alt+shift+L
复习总结
Arrays
public static void main(String[] args) {
String[] data = { "zhangsan", "lisi", "wanger", "mazi","qianwu","zhaoliu" };
List<String> asList = Arrays.asList(data);
System.out.println(asList);
System.out.println(data);
System.out.println(Arrays.toString(data));
int binarySearch = Arrays.binarySearch(data, "lisi");
System.out.println(binarySearch);
//对数组进行扩容
String[] copyOf = Arrays.copyOf(data, data.length + 4);
for (String item : copyOf)
System.out.println(item);
String[] copyOfRange = Arrays.copyOfRange(data, 2, 4);
System.out.println(Arrays.toString(copyOfRange));
String[] copyOf2 = Arrays.copyOf(data, data.length);
boolean equals = Arrays.equals(data,copyOf2);//比较两个数组的内容是否相等
System.out.println(equals);
boolean[] bol = new boolean[8];
System.out.println(Arrays.toString(bol));
Arrays.fill(bol,true);
System.out.println(Arrays.toString(bol));
Arrays.sort(data);
System.out.println(Arrays.toString(data));
System.out.println("--------------------");
//匿名内部类
Comparator<String> c = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.length()-o1.length();
}
};
Arrays.sort(data,c);
System.out.println(Arrays.toString(data));
data = new String[]{ "zhangsan", "lisi", "wanger", "mazi","qianwu","zhaoliu" };
Arrays.sort(data,(o1,o2)->o2.length()-o1.length());
System.out.println(Arrays.toString(data));
}
collections
public static void main(String[] args) {
List<String> list = new ArrayList<>();
Collections.addAll(list,"zhangsan", "lisi","zhangsan","wanger","zhangsan","mazi");
System.out.println(list);
int binarySearch = Collections.binarySearch(list, "lisi3");
System.out.println(binarySearch);
int binarySearch2 = Collections.binarySearch(list, "wanger", (o1,o2)->o1.length()-o2.length());
System.out.println(binarySearch2);
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
});
System.out.println(list);
Collections.shuffle(list);
System.out.println(list);
Collections.sort(list, (o1,o2)->o1.length()-o2.length());;
System.out.println(list);
Collections.replaceAll(list, "zhangsan", "***");
System.out.println(list);
Collections.swap(list, 1, 3);
System.out.println(list);
Collections.reverse(list);
System.out.println(list);
}
list
public static void main(String[] args) {
List<String> list = new ArrayList<>();
Collections.addAll(list,"zhangsan", "lisi","wanger","mazi");
for(int i =0;i<list.size();i++){
System.out.println(list.get(i));
}
for(String item : list){
System.out.println(item);
}
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
ListIterator<String> listIterator = list.listIterator();
while(listIterator.hasNext()){
System.out.println(listIterator.next());
}
list.forEach(item->System.out.println(item));
list.forEach(System.out::println);
}
set
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("aa");
set.add("bb");
set.add("cc");
set.add("dd");
for(String item : set){
System.out.println(item);
}
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
set.forEach(item->System.out.println(item));
set.forEach(System.out::println);
}
map
原则:将 map 变为 set
public static void main(String[] args) {
Map<Integer,Goods> map = new HashMap<>();
map.put(111, new Goods(111,"aaa",1,"aaaaaaaaaaa"));
map.put(222, new Goods(222,"bbb",2,"bbbbbbbbbbbbb"));
map.put(333, new Goods(333,"ccc",3,"ccccccccccccc"));
map.put(444, new Goods(444,"ddd",4,"dddddddddddd"));
Set<Integer> keySet = map.keySet();
for(Integer key : keySet){
System.out.println(key+" : "+map.get(key));
}
Set<Entry<Integer, Goods>> entrySet = map.entrySet();
for(Entry<Integer, Goods> item : entrySet){
System.out.println(item.getKey()+" "+item.getValue());
}
map.forEach((k,v)->System.out.println(k+" :: "+v));;
}
扩展:
public static void main(String[] args) {
List<String> list = Arrays.asList("zhangsan","lisi","wanger","mazi");
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
System.out.println(list);
System.out.println("-------------");
list.forEach(item->System.out.println(item+" "+item.hashCode()));
list.sort((o1,o2)->{
return o1.hashCode()- o2.hashCode();
});
list.forEach(System.out::println);
}
2022-08-20:给定区间的范围 [xi,yi],xi<=yi,且都是正整数, 找出一个坐标集合 set,set 中有若干个数字, set 要和每个给定的区间,有交集。 求 set 的最少需要几个数。 比如给
2022-08-20:给定区间的范围 [xi,yi],xi<=yi,且都是正整数, 找出一个坐标集合 set,set 中有若干个数字, set 要和每个给定的区间,有交集。 求 set 的最少需要几个数。 比如给定区间 : [5, 8] [1, 7] [2, 4] [1, 9], set 最小可以是: {2, 6} 或者 {2, 5} 或者 {4, 5}。
答案 2022-08-20:
生成事件,排序,遍历事件获得结果。
代码用 rust 编写。代码如下:
use std::collections::HashSet;
fn main() {
let mut arr: Vec<Vec<i32>> = vec![vec![5, 8], vec![1, 7], vec![2, 4], vec![1, 9]];
let ans1 = min_set(&mut arr);
println!("ans1 = {}", ans1);
}
fn min_set(ranges: &mut Vec<Vec<i32>>) -> i32 {
let n = ranges.len() as i32;
// events[i] = {a, b, c}
// a == 0, 表示这是一个区间的开始事件,这个区间结束位置是b
// a == 1, 表示这是一个区间的结束事件,b的值没有意义
// c表示这个事件的时间点,不管是开始事件还是结束事件,都会有c这个值
let mut events: Vec<Vec<i32>> = vec![];
for i in 0..n << 1 {
events.push(vec![]);
for _ in 0..3 {
events[i as usize].push(0);
}
}
for i in 0..n {
// [3, 7]
// (0,7,3)
// (1,X,7)
events[i as usize][0] = 0;
events[i as usize][1] = ranges[i as usize][1];
events[i as usize][2] = ranges[i as usize][0];
events[(i + n) as usize][0] = 1;
events[(i + n) as usize][2] = ranges[i as usize][1];
}
events.sort_by(|a, b| a[2].cmp(&b[2]));
// 容器
let mut tmp: HashSet<i32> = HashSet::new();
let mut ans = 0;
for event in events.iter() {
if event[0] == 0 {
tmp.insert(event[1]);
} else {
if tmp.contains(&event[2]) {
ans += 1;
tmp.clear();
}
}
}
return ans;
}
执行结果如下:
左神 java 代码
java List Set Map
1、List,Set 都是继承自 Collection 接口
2、List 特点:元素有放入顺序,元素可重复 ,Set 特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在 set 中的位置是有该元素的 HashCode 决定的,其位置其实是固定的)
3、List 接口有三个实现类:LinkedList,ArrayList,Vector ,Set 接口有两个实现类:HashSet (底层由 HashMap 实现),LinkedHashSet
List:
1、Vector、ArrayList 都是以类似数组的形式存储在内存中,LinkedList 则以链表的形式进行存储。
2、Vector 线程同步,ArrayList、LinkedList 线程不同步。
3、LinkedList 适合指定位置插入、删除操作,不适合查找;ArrayList、Vector 适合查找,不适合指定位置的插入、删除操作。
4、ArrayList 在元素填满容器时会自动扩充容器大小的 50%,而 Vector 则是 100%,因此 ArrayList 更节省空间。
对 List 的选择
1)对于随机查询与迭代遍历操作,数组比所有的容器都要快。所以在随机访问中一般使用 ArrayList。
2)LinkedList 使用双向链表对元素的增加和删除提供了非常好的支持,而 ArrayList 执行增加和删除元素需要进行元素位移。
3)对于 Vector 而已,我们一般都是避免使用。(ArrayList 可用通过 Collections 中的方法转换为线程安全类)
4)将 ArrayList 当做首选,毕竟对于集合元素而已我们都是进行遍历,只有当程序的性能因为 List 的频繁插入和删除而降低时,再考虑 LinkedList。
Set:
Set 里面的去重复原理
set 及子类的 方法 add.()
其实里面调用了重写之后的 equals () 和 hashcode () 方法 :
重写之后 hashcode () 比较是这俩元素对象的哈希值是否是同一个哈希值如果不同讲该元素放到数组中 如果相同返回 true 就进行 equals 比较
重写之后 equals () 比较这俩元素对象是否是同一个对象 是返回 true 而且不把该元素放到数组中
HashSet 的数据结构
哈希表 = 数组 + 链表 / 红黑二叉树(在链表元素大于 8 个之上就转换为二叉树)
比较的是里面的元素对象的 hashcode 是否相同 相同就挂在同一个数组元素下面
如果元素不同 但是哈希值相同这就是哈希值冲突 会进行 equals 判断 是否为同一个元素
使用 hashset 集合来存储自定义类型 该类必须重写 hashcode 和 equals 方法再 Set 集合中才可以进行判断去重复
LinkedHashSet 集合包含了 HashSet 集合但是在这之上增加了 一条链表是来记录顺序的
所以 LinkedHashSet 是有序的
对 Set 的选择
1)HashSet 由于使用 HashCode 实现,所以在某种程度上来说它的性能永远比 TreeSet 要好,尤其是进行增加和查找操作。
2)虽然 TreeSet 没有 HashSet 性能好,但是由于它可以维持元素的排序,所以它还是存在用武之地的。
Map:
Map 是一个双列集合接口,如果实现了 Map 接口,特点是数据以键值对形式存在,键不可重复,值可以重复。java 中主要有 HashMap、TreeMap、Hashtable。本文主要介绍 Map 的接口方法:
1 HashMap、TreeMap、Hashtable
HashMap 的存储原理:
HashMap 底层也是基于哈希表实现的。往 HashMap 添加元素的时候,首先会调用键的 hashCode 方法得到元素 的哈希码值,然后经过运算就可以算出该元素在哈希表中的存储位置。
情况 1: 如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中。
情况 2:如果算出 的位置目前已经存在其他的元素,那么还会调用该元素的 equals 方法与这个位置上的元素进行比较,如果 equals 方法返回 的是 false,那么该元素允许被存储,如果 equals 方法返回的是 true,那么该元素被视为重复元素,不允存储。
TreeMap 存储原理:
TreeMap 也是基于红黑树(二叉树)数据结构实现 的, 特点:会对元素的键进行排序存储。
TreeMap 要注意的事项:
1. 往 TreeMap 添加元素的时候,如果元素的键具备自然顺序,那么就会按照键的自然顺序特性进行排序存储。
2. 往 TreeMap 添加元素的时候,如果元素的键不具备自然顺序特性, 那么键所属的类必须要实现 Comparable 接口,把键的比较规则定义在 CompareTo 方法上。
3. 往 TreeMap 添加元素的时候,如果元素的键不具备自然顺序特性,而且键所属的类也没有实现 Comparable 接口,那么就必须在创建 TreeMap 对象的时候传入比较器。
Hashtable 存储原理:
底层也是 hash 表实现,实现方式和 HashMap 一致,但是 hashTable 是线程安全的,操作效率低。
补充:如何选择合适的 Map
- HashMap 可实现快速存储和检索,但其缺点是其包含的元素是无序的,这导致它在存在大量迭代的情况下表现不佳。
- LinkedHashMap 保留了 HashMap 的优势,且其包含的元素是有序的。它在有大量迭代的情况下表现更好。
- TreeMap 能便捷的实现对其内部元素的各种排序,但其一般性能比前两种 map 差。
LinkedHashMap 映射减少了 HashMap 排序中的混乱,且不会导致 TreeMap 的性能损失。
对 Map 的选择
1)HashMap 与 HashSet 同样,支持快速查询。虽然 HashTable 速度的速度也不慢,但是在 HashMap 面前还是稍微慢了些,所以 HashMap 在查询方面可以取代 HashTable。
2)由于 TreeMap 需要维持内部元素的顺序,所以它通常要比 HashMap 和 HashTable 慢。
java list,set,map,数组间的相互转换详解
这篇文章主要介绍了java list,set,map,数组间的相互转换详解的相关资料,这里附有实例代码,具有参考价值,需要的朋友可以参考下
java list,set,map,数组间的相互转换详解
1.list转set
Set set = new HashSet( new ArrayList());
2.set转list
List list = new ArrayList( new HashSet());
3.数组转为list
List stooges = Arrays.asList( "Larry" , "Moe" , "Curly" );
此时stooges中有有三个元素。注意:此时的list不能进行add操作,否则会报 “java.lang.UnsupportedOperationException”,Arrays.asList()返回的是List,而且是一个定 长的List,所以不能转换为ArrayList,只能转换为AbstractList
原因在于asList()方法返回的是某个数组的列表形式,返回的列表只是数组的另一个视图,而数组本身并没有消失,对列表的任何操作最终都反映在数组上. 所以不支持remove,add方法的
String[] arr = { "1" , "2" }; List list = Arrays.asList(arr);
4.数组转为set
int [] a = { 1 , 2 , 3 }; Set set = new HashSet(Arrays.asList(a));
5.map的相关操作。
Map map = new HashMap(); map.put("1" , "a" ); map.put('2' , 'b' ); map.put('3' , 'c' ); System.out.println(map); // 输出所有的值 System.out.println(map.keySet()); // 输出所有的键 System.out.println(map.values()); // 将map的值转化为List List list = new ArrayList(map.values()); System.out.println(list); // 将map的值转化为Set Set set = new HashSet(map.values()); System.out.println(set);
6.list转数组
List list = Arrays.asList( "a" , "b" ); System.out.println(list); String[] arr = (String[])list.toArray(new String[list.size()]); System.out.println(Arrays.toString(arr));
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
Java List,List <?>,List ,List 和List
有什么区别List,List<?>,List<T>,List<E>
,和List<Object>
?
1. List
List
:是原始类型,因此不是typesafe
。仅在转换不良时才会生成运行时错误。当强制转换错误时,我们需要一个编译时错误。不建议使用。
2. List<?>
List<?>
是一个无界通配符。但是我不确定它是做什么用的吗?我可以打印一个List<?>
没有问题的文件:
public static void test(List<?> list){ System.out.println(list); // Works}
为什么我不能向中添加项目List<?>
?
public static void test(List<?> list){ list.add(new Long(2)); // Error list.add("2"); // Error System.out.println(list);}
3. List
public static void test(List<T> list){ // T cannot be resolved System.out.println(list);}
我不明白这种语法。我看到了这样的东西,它的工作原理是:
public <T> T[] toArray(T[] a){ return a; }
有时候,我看<T>
,或者<E>
,或者<U>
,<T,E>
。它们都是相同的还是代表不同的东西?
4.List
答案1
小编典典1)正确
2)你可以将其视为“只读”列表,而不关心项目的类型。例如,可以由返回列表长度的方法使用。
3)T,E和U相同,但是人们倾向于使用T作为类型,E表示Element,V表示值,K表示键。编译的方法表示它接受了某种类型的数组,并返回了相同类型的数组。
4)你不能混合桔子和苹果。如果可以将字符串列表传递给需要对象列表的方法,则可以将对象添加到字符串列表中。(并非所有对象都是字符串)
今天关于Java —— 集合框架 list lambda set map 遍历方法 数据结构和java集合遍历的几种方法的分享就到这里,希望大家有所收获,若想了解更多关于2022-08-20:给定区间的范围 [xi,yi],xi<=yi,且都是正整数, 找出一个坐标集合 set,set 中有若干个数字, set 要和每个给定的区间,有交集。 求 set 的最少需要几个数。 比如给、java List Set Map、java list,set,map,数组间的相互转换详解、Java List,List <?>,List
本文标签: