我有以下课程:
class Data {
String systemId;
String fileName;
int x;
int y;
Data(String systemId, String fileName, int x, int y) {
this.systemId = systemId;
this.fileName = fileName;
this.x = x;
this.y = y;
}
public String getSystemId() {
return systemId;
}
public void setSystemId(String systemId) {
this.systemId = systemId;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
class Result {
int x;
int y;
Result(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
List<Data> dataList = new ArrayList<>();
Data x1 = new Data("n1", "f1", 3, 4);
Data x2 = new Data("n1", "f1", 1, 2);
Data x3 = new Data("n1", "f1", 5, 6);
Data x4 = new Data("n1", "f2", 7, 8);
Data x5 = new Data("n2", "f1", 9, 10);
Data x6 = new Data("n2", "f2", 11, 12);
Data x7 = new Data("n3", "f1", 13, 14);
Data x8 = new Data("n4", "f1", 15, 16);
Data x9 = new Data("n1", "f1", 5, 10);
Data x10 = new Data("n1", "f1", 5, 2);
dataList.add(x1);dataList.add(x2);dataList.add(x3);dataList.add(x4);dataList.add(x5);dataList.add(x6);dataList.add(x7);dataList.add(x8);
我想使用Java流从给定的输入列表中创建一个Map<String, List<Result>>
。另外,列表值需要根据字段(x和y)以升序排序
我需要输出映射如下:
{"n1:f1" : [(1, 2), (3, 4), (5, 2), (5,6), (5,10)]
"n1:f2" : [(7, 8)]
"n2:f1" : [(9, 10)]
"n2:f2" : [(11, 12)]
"n3:f1" : [(13, 14)]
"n4:f1" : [(15, 16)]
}
映射的键是由冒号连接的systemid和文件名的组合。列表的值首先需要按x排序,然后按y排序。
答案 0 :(得分:4)
类似:
Map<String, List<Result>> collect = dataList.stream()
.sorted(Comparator.comparing(Data::getX).thenComparing(Data::getY))
.collect(Collectors.groupingBy(d -> d.getSystemId() + ":" + d.getFileName(),
Collectors.mapping(d -> new Result(d.getX(), d.getY()), toList())));
答案 1 :(得分:0)
class Data {
String systemId;
String fileName;
int x;
int y;
Data(String systemId, String fileName, int x, int y) {
this.systemId = systemId;
this.fileName = fileName;
this.x = x;
this.y = y;
}
public String getSystemId() {
return systemId;
}
public void setSystemId(String systemId) {
this.systemId = systemId;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
class Result {
int x;
int y;
Result(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
@Override
public String toString() {
return "("+getX() +","+ getY()+")";
}
}
public class MainClass {
public static void main(String[] args) {
List<Data> dataList = new ArrayList<Data>();
Data x1 = new Data("n1", "f1", 3, 4);
Data x2 = new Data("n1", "f1", 1, 2);
Data x3 = new Data("n1", "f1", 5, 6);
Data x4 = new Data("n1", "f2", 7, 8);
Data x5 = new Data("n2", "f1", 9, 10);
Data x6 = new Data("n2", "f2", 11, 12);
Data x7 = new Data("n3", "f1", 13, 14);
Data x8 = new Data("n4", "f1", 15, 16);
Data x9 = new Data("n1", "f1", 5, 10);
Data x10 = new Data("n1", "f1", 5, 2);
dataList.add(x1);
dataList.add(x2);
dataList.add(x3);
dataList.add(x4);
dataList.add(x5);
dataList.add(x6);
dataList.add(x7);
dataList.add(x8);
dataList.add(x9);
dataList.add(x10);
Map<String, List<Result>> collect = dataList.stream()
.sorted(Comparator.comparing(Data::getX).thenComparing(Data::getY))
.collect(Collectors.groupingBy(d -> d.getSystemId() + ":" + d.getFileName(),
Collectors.mapping(d -> new Result(d.getX(), d.getY()), Collectors.toList())));
Map<String, List<Result>> sortedMap = new TreeMap<String, List<Result>>(collect);
System.out.println(sortedMap);
}
}
输出:{n1:f1 = [(1,2 ,,(3,4),(5,2),(5,6),(5,10)],n1:f2 = [(7, 8)],n2:f1 = [(9,10)],n2:f2 = [(11,12)],n3:f1 = [(13,14)],n4:f1 = [(15,16) ]}
尝试一下,它正在我的机器上工作。