使用java 开发一个数据多线程数据拼接业务,一个实体类 有4个属性 id,param,no,num等 ,id是唯一标识符,param是拼接数据,no是用于排序,num是同一id下数据总数,业务需求是根据id判断是否同一个拼接的数据,然后将根据num判断接收的数据是否完整,如果是则根据no进行排序然后拼接param,如果不是则放入缓存,写出相应设计及代码
时间: 2024-03-11 10:48:31 浏览: 59
设计思路:
1. 维护一个 Map,key 为 id,value 为 List,用于存储同一个 id 对应的多条数据。
2. 在存储数据时,判断 Map 中是否已经存在该 id 对应的 List,如果不存在则新建一个 List,并将数据存入;如果存在则将数据添加到对应的 List 中。
3. 在每次存储数据后,判断该 id 对应的 List 中数据的数量是否等于 num,如果等于则将 List 中的数据按照 no 进行排序,然后将 param 拼接起来。
4. 如果数量不足 num,则将 List 存入缓存,等待后续的数据到达。
5. 可以使用多线程进行数据的处理,每个线程负责从缓存中取出数据进行处理。
代码实现:
```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DataJoiner {
private Map<String, List<Data>> dataMap = new HashMap<>(); // 存储数据的 Map
private Map<String, List<Data>> cacheMap = new HashMap<>(); // 存储未完成的数据的 Map
private int num; // 每个 id 对应的数据数量
public DataJoiner(int num) {
this.num = num;
}
public synchronized void addData(Data newData) {
String id = newData.getId();
List<Data> dataList = dataMap.get(id);
if (dataList == null) {
dataList = new ArrayList<>();
dataMap.put(id, dataList);
}
dataList.add(newData);
if (dataList.size() == num) { // 数据数量达到要求,进行拼接
Collections.sort(dataList);
StringBuilder sb = new StringBuilder();
for (Data data : dataList) {
sb.append(data.getParam());
}
System.out.println(sb.toString());
dataMap.remove(id);
} else if (dataList.size() < num) { // 数据数量不足,放入缓存
List<Data> cacheList = cacheMap.get(id);
if (cacheList == null) {
cacheList = new ArrayList<>();
cacheMap.put(id, cacheList);
}
cacheList.add(newData);
} else { // 数据数量超过要求,清空数据并输出错误信息
dataMap.remove(id);
System.out.println("Error: id " + id + " contains too many data.");
}
}
public synchronized void processCache() {
for (Map.Entry<String, List<Data>> entry : cacheMap.entrySet()) {
String id = entry.getKey();
List<Data> dataList = dataMap.get(id);
if (dataList == null) {
dataList = new ArrayList<>();
dataMap.put(id, dataList);
}
dataList.addAll(entry.getValue());
if (dataList.size() == num) { // 数据数量达到要求,进行拼接
Collections.sort(dataList);
StringBuilder sb = new StringBuilder();
for (Data data : dataList) {
sb.append(data.getParam());
}
System.out.println(sb.toString());
dataMap.remove(id);
}
}
cacheMap.clear();
}
public static void main(String[] args) {
DataJoiner joiner = new DataJoiner(3); // 每个 id 对应的数据数量为 3
joiner.addData(new Data("1", "aaa", 1, 3));
joiner.addData(new Data("2", "bbb", 1, 3));
joiner.addData(new Data("1", "ccc", 2, 3));
joiner.addData(new Data("3", "ddd", 1, 2));
joiner.addData(new Data("2", "eee", 2, 3));
joiner.addData(new Data("1", "fff", 3, 3));
joiner.processCache();
}
private static class Data implements Comparable<Data> {
private String id;
private String param;
private int no;
private int num;
public Data(String id, String param, int no, int num) {
this.id = id;
this.param = param;
this.no = no;
this.num = num;
}
public String getId() {
return id;
}
public String getParam() {
return param;
}
public int getNo() {
return no;
}
public int getNum() {
return num;
}
@Override
public int compareTo(Data o) {
return Integer.compare(no, o.no);
}
}
}
```
注:以上代码仅作为实现的示例,实际业务场景中可能需要进行更多的异常处理和线程安全保障。
阅读全文