用stream流 先按照手机号是否为空排序,再按照创建时间排序
时间: 2023-05-22 14:06:20 浏览: 90
好的,这是一个涉及编程的问题。你可以使用Java 8的Comparator类来完成这个任务,以下是一段可能的代码片段:
```
listOfObjects.stream()
.sorted(Comparator.comparing((MyObject o) -> o.getPhoneNumber() == null)
.thenComparing(MyObject::getCreateTime))
.collect(Collectors.toList());
```
在这个代码片段中,我们使用了Java 8的Lambda表达式,并使用了Comparator类的comparing和thenComparing方法来实现对listOfObjects按照手机号是否为空和创建时间排序的操作。
相关问题
用 stream 流先按照时间排序,再把在按照手机号是否为空排序
可以使用 Java 8 中的流式编程进行处理,具体代码如下:
```java
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
// 假设我们有一个名为 records 的数据列表,包含了多个 Record 对象
List<Record> sortedRecords = records.stream()
.sorted(Comparator.comparing(Record::getTime))
.sorted(Comparator.comparing(record -> record.getPhoneNumber() == null))
.collect(Collectors.toList());
}
}
class Record {
private String phoneNumber; // 手机号
private long time; // 时间戳
public String getPhoneNumber() {
return phoneNumber;
}
public long getTime() {
return time;
}
}
```
这段代码中,我们先根据时间戳 `time` 进行排序,然后再根据 `phoneNumber` 是否为空进行排序,最后把排序好的记录收集到一个列表中。注意到我们使用了两个 `sorted()` 方法,并通过 `Comparator.comparing()` 返回一个函数式接口来指定排序条件。同时,我们使用了 `Collectors.toList()` 方法把排序好的记录收集到一个列表中。
一个phone.txt文件有id,日期,手机号码、型号、操作系统字段,要求根据文件的手机号码前三位判断是移动,电信还是联通,并分析2022年手机运营商市场占比情况,基于MapReduce用JAVA语言完成
好的,我理解您的要求了。首先,您需要编写一个MapReduce程序,对phone.txt文件进行处理,根据手机号码前三位判断其运营商,并将结果输出到不同的文件中。然后,您需要对输出文件进行分析,得出2022年手机运营商市场占比情况。下面是一个参考的代码实现:
1. MapReduce程序代码
```java
public class PhoneMapper extends Mapper<LongWritable, Text, Text, Text> {
private Text outputKey = new Text();
private Text outputValue = new Text();
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] fields = value.toString().split(",");
String phoneNumber = fields[2];
String operator = getOperator(phoneNumber);
outputKey.set(operator);
outputValue.set(phoneNumber + "," + fields[3] + "," + fields[4]);
context.write(outputKey, outputValue);
}
private String getOperator(String phoneNumber) {
String prefix = phoneNumber.substring(0, 3);
if (prefix.equals("130") || prefix.equals("131") || prefix.equals("132") || prefix.equals("155") || prefix.equals("156")) {
return "中国联通";
} else if (prefix.equals("133") || prefix.equals("153") || prefix.equals("180") || prefix.equals("189")) {
return "中国电信";
} else if (prefix.equals("134") || prefix.equals("135") || prefix.equals("136") || prefix.equals("137") || prefix.equals("138") || prefix.equals("139")
|| prefix.equals("147") || prefix.equals("150") || prefix.equals("151") || prefix.equals("152") || prefix.equals("157") || prefix.equals("158")
|| prefix.equals("159") || prefix.equals("182") || prefix.equals("183") || prefix.equals("184") || prefix.equals("187") || prefix.equals("188")
|| prefix.equals("198")) {
return "中国移动";
} else {
return "未知";
}
}
}
public class PhoneReducer extends Reducer<Text, Text, Text, Text> {
private Text outputValue = new Text();
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
int count = 0;
for (Text value : values) {
count++;
}
outputValue.set(String.valueOf(count));
context.write(key, outputValue);
}
}
public class PhoneDriver {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "Phone Operator Count");
job.setJarByClass(PhoneDriver.class);
job.setMapperClass(PhoneMapper.class);
job.setReducerClass(PhoneReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
```
2. 分析程序代码
```java
public class PhoneAnalyzer {
public static void main(String[] args) throws IOException {
Map<String, Integer> operatorCounts = new HashMap<>();
BufferedReader reader = new BufferedReader(new FileReader(args[0]));
String line;
while ((line = reader.readLine()) != null) {
String[] fields = line.split("\t");
String operator = fields[0];
int count = Integer.parseInt(fields[1]);
operatorCounts.put(operator, count);
}
reader.close();
int total = operatorCounts.values().stream().mapToInt(Integer::intValue).sum();
DecimalFormat df = new DecimalFormat("0.00%");
System.out.println("中国移动占比:" + df.format((float) operatorCounts.get("中国移动") / total));
System.out.println("中国联通占比:" + df.format((float) operatorCounts.get("中国联通") / total));
System.out.println("中国电信占比:" + df.format((float) operatorCounts.get("中国电信") / total));
System.out.println("未知占比:" + df.format((float) operatorCounts.get("未知") / total));
}
}
```
在运行程序时,需要将phone.txt文件放到Hadoop的文件系统中,并执行以下命令:
```
hadoop jar Phone.jar PhoneDriver /input/phone.txt /output
```
其中,/input/phone.txt是输入文件路径,/output是输出目录路径。
执行MapReduce程序后,会生成三个文件,分别是part-r-00000、part-r-00001和part-r-00002。这些文件中的内容就是每个运营商的用户数量。
最后,执行分析程序,统计出每个运营商的占比情况。
注意:为了保证分析程序的正确性,需要对输出文件进行合并,并按照运营商名称排序。
阅读全文