java学习
一.steam流
1.介绍
Stream 是 Java 8 中引入的一种处理集合数据的新抽象。它提供了一种高效且便利的方式来处理集合中的元素,支持函数式编程的特性,使得集合操作变得更加简洁和灵活。
2.创建
List和Set可以直接调用接口的steam方法转换为流
List<String> s1= new ArrayList<>();
s1.stream();
Set<String> s=new HashSet<>();
s.stream();
注意:map不能直接创建stream流,可以使用Map接口的keySet().stream()
方法将Map的键集合转换为流,或使用values().stream()
方法将Map的值集合转换为流。
Stream<String> keyStream = map.keySet().stream();
Stream<Integer> valueStream = map.values().stream();
3.forerch(遍历)
在前面没有加限定操作的时候foreach可以遍历输出集合内的全部元素。
public class test {
public static void main(String[] args) {
List<String> s1=new ArrayList<>();
Collections.addAll(s1,"张三","李四","王五","猪八戒","孙悟空");
s1.stream().forEach(System.out::println);
}
}
4.filter(筛选)
fiter可以对我们流进行筛选,筛除不符合我们要求的元素,用上面的例子。
如果我们只需要保留名字长度为2的元素。
那么我们只需要保证元素.length()==2就行。
List<String> s1=new ArrayList<>();
Collections.addAll(s1,"张三","李四","王五","猪八戒","孙悟空");
s1.stream().filter(s->s.length()==2).forEach(System.out::println);
我们还可以多次筛选,可以用多个filter或者用&&加多个条件。
List<String> s1=new ArrayList<>();
Collections.addAll(s1,"张三","李四","王五","猪八戒","孙悟空");
s1.stream().filter(s->s.length()==2&&s.startsWith("张") ).forEach(System.out::println);
List<String> s1=new ArrayList<>();
Collections.addAll(s1,"张三","李四","王五","猪八戒","孙悟空");
s1.stream().filter(s->s.length()==2).filter(s->s.startsWith("张")).forEach(System.out::println);
5.sorted(流排序)
sorted可以将流按照从小到大排序。
List<String> s1=new ArrayList<>();
Collections.addAll(s1,"cba","acb","bac","abc","cab");
s1.stream().sorted().forEach(System.out::println);
这里先介绍部分,还有很多很方便的没有介绍。
二.蓝桥杯真题练习
1.接龙数列
样例输入
5 11 121 22 12 2023
样例输出
1
一道dp题,不看题解都想不到是dp题
#include<iostream>
#define ll long long
using namespace std;
int main()
{
ll n;
cin>>n;
ll dp[11]={0},ans=-1;//最长序列
for(int i=0;i<n;i++){
string a;
cin>>a;
ll b=a.back()-'0',c=a[0]-'0';
dp[b]=max(dp[b],dp[c]+1);
ans=max(ans,dp[b]);
}
cout<<n-ans<<endl;//这里输出需要删除的个数
return 0;
}
2.冶炼金属
样例输入
3 75 3 53 2 59 2
样例输出
20 25
这里需要数学手算一下。
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n;
cin >> n;
int mi = 0, mx = 1e9;
while (n--) {
int a, b;
cin >> a >> b;
mi = max(a / (b + 1) + 1, mi);
mx = min(a / b, mx);
}
cout << mi << " " << mx << endl;
return 0;
}