Java 如何以特定的排序顺序高效地读取csv列表?
我正在阅读一个Java 如何以特定的排序顺序高效地读取csv列表?,java,spring-boot,csv,collections,Java,Spring Boot,Csv,Collections,我正在阅读一个CSV,并使用ICsvBeanReader将其映射到一个列表 csv: 一旦我有了列表数据列表,我将运行嵌套for循环以获得我想要实现的目标 定义顺序: 预期: “someNumber”的映射和report、env、dir的组合(按定义的顺序) 编码: 获取订单: Map<Integer, String> dirOrder = {1-FIRS, 2-LAS}; // getting from defined config Map<Integer, String&g
CSV
,并使用ICsvBeanReader
将其映射到一个列表
csv:
一旦我有了列表
数据列表,我将运行嵌套for循环以获得我想要实现的目标
定义顺序:
预期:
“someNumber”的映射和report、env、dir的组合(按定义的顺序)
编码:
获取订单:
Map<Integer, String> dirOrder = {1-FIRS, 2-LAS}; // getting from defined config
Map<Integer, String> envOrder = {1-P, 2-T}; // getting from defined config
Map<Integer, String> reportOrder = {1-ORD, 2-DES, 3-INV};// getting from defined config
Map dirOrder={1-FIRS,2-LAS};//从已定义的配置获取
Map envOrder={1-P,2-T};//从已定义的配置获取
映射报告顺序={1-ORD,2-DES,3-INV};//从已定义的配置获取
运行循环以准备映射:
MultiValuedMap < String, String > mapProperOrder = new ArrayListValuedHashMap < > ();
for (Map.Entry < Integer, String > directionEntry: dirOrder.entrySet()) {
String directionValue = directionEntry.getValue();
for (Map.Entry < Integer, String > envirionmentEntry: envOrder.entrySet()) {
String envirionmentValue = envirionmentEntry.getValue();
for (Map.Entry < Integer, String > reportTypeEntry: reportOrder.entrySet()) {
String reportTypeValue = reportTypeEntry.getValue();
for (SomeBean someBean: (List < SomeBean > ) someList) {
String num = someBean.getNum();
String dir = someBean.getDir();
String env = someBean.getEnv();
String report = someBean.getReport);
boolean directionCheck = dir.equalsIgnoreCase(directionValue) ? true : false;
boolean envirionmentCheck = env.equalsIgnoreCase(envirionmentValue) ? true : false;
boolean reportTypeCheck = report.equalsIgnoreCase(reportTypeValue) ? true : false;
if (directionCheck && envirionmentCheck && reportTypeCheck) {
mapProperOrder.put(num, report + "-" + env + "-" + dir);
}
}
}
}
}
MultiValuedMapmapProperOrder=newarraylistvaluedhashmap<>();
对于(Map.EntrydirectionEntry:dirOrder.entrySet()){
字符串directionValue=directionEntry.getValue();
对于(Map.EntryenvironContentry:envOrder.entrySet()){
字符串environmentvalue=environmenttry.getValue();
对于(Map.EntryreportTypeEntry:reportOrder.entrySet()){
字符串reportTypeValue=reportTypeEntry.getValue();
for(SomeBean SomeBean:(List)someList){
String num=someBean.getNum();
String dir=someBean.getDir();
字符串env=someBean.getEnv();
String report=someBean.getReport);
布尔方向检查=dir.equalsIgnoreCase(directionValue)?真:假;
布尔environmentcheck=env.equalsIgnoreCase(environmentvalue)?真:假;
布尔reportTypeCheck=report.equalsIgnoreCase(reportTypeValue)?真:假;
if(方向检查和环境检查和报告类型检查){
放置(num,report+“-”+env+“-”+dir);
}
}
}
}
}
这段代码完成了它的工作,但是如果CSV中有多个“someNumber”,那么为所有记录运行嵌套的for循环将是无效的
请帮助我编写一个简单而有效的方法来处理此问题。如果此订单是应用程序范围内的默认订单或自定义比较器,我个人将在SomeBean
中实现Comparable
接口
实现可能如下所示:
public int compare(SomeBean o1, SomeBean o2) {
Map<String, Integer> firstLevel = new HashMap<>();
firstLevel.put("FIRS", 1);
firstLevel.put("LAS", 2);
int cmp = firstLevel.get(o1.getDir()).compareTo(firstLevel.get(o2.getDir()));
if (cmp != 0) {
return cmp;
}
Map<String, Integer> secondLevel = new HashMap<>();
secondLevel.put("P", 1);
secondLevel.put("T", 2);
cmp = secondLevel.get(o1.getEnv()).compareTo(secondLevel.get(o2.getEnv()));
if (cmp != 0) {
return cmp;
}
Map<String, Integer> thirdLevel = new HashMap<>();
thirdLevel.put("ORD", 1);
thirdLevel.put("DES", 2);
thirdLevel.put("INV", 3);
return thirdLevel.get(o1.getReport()).compareTo(thirdLevel.get(o2.getReport()));
}
public int比较(SomeBean o1,SomeBean o2){
Map firstLevel=newhashmap();
第一级。第一级(第一级);
第一级。put(“LAS”,2);
int cmp=firstLevel.get(o1.getDir()).compareTo(firstLevel.get(o2.getDir());
如果(cmp!=0){
返回cmp;
}
Map secondLevel=newhashmap();
第二级。put(“P”,1);
第二级。投入(“T”,2);
cmp=secondLevel.get(o1.getEnv()).compareTo(secondLevel.get(o2.getEnv());
如果(cmp!=0){
返回cmp;
}
Map thirdLevel=newhashmap();
第三级付诸表决(“ORD”,1);
第三级put(“DES”,2);
第三级投入(“投资”,3);
返回thirdLevel.get(o1.getReport()).compareTo(thirdLevel.get(o2.getReport());
}
Map<Integer, String> dirOrder = {1-FIRS, 2-LAS}; // getting from defined config
Map<Integer, String> envOrder = {1-P, 2-T}; // getting from defined config
Map<Integer, String> reportOrder = {1-ORD, 2-DES, 3-INV};// getting from defined config
MultiValuedMap < String, String > mapProperOrder = new ArrayListValuedHashMap < > ();
for (Map.Entry < Integer, String > directionEntry: dirOrder.entrySet()) {
String directionValue = directionEntry.getValue();
for (Map.Entry < Integer, String > envirionmentEntry: envOrder.entrySet()) {
String envirionmentValue = envirionmentEntry.getValue();
for (Map.Entry < Integer, String > reportTypeEntry: reportOrder.entrySet()) {
String reportTypeValue = reportTypeEntry.getValue();
for (SomeBean someBean: (List < SomeBean > ) someList) {
String num = someBean.getNum();
String dir = someBean.getDir();
String env = someBean.getEnv();
String report = someBean.getReport);
boolean directionCheck = dir.equalsIgnoreCase(directionValue) ? true : false;
boolean envirionmentCheck = env.equalsIgnoreCase(envirionmentValue) ? true : false;
boolean reportTypeCheck = report.equalsIgnoreCase(reportTypeValue) ? true : false;
if (directionCheck && envirionmentCheck && reportTypeCheck) {
mapProperOrder.put(num, report + "-" + env + "-" + dir);
}
}
}
}
}
public int compare(SomeBean o1, SomeBean o2) {
Map<String, Integer> firstLevel = new HashMap<>();
firstLevel.put("FIRS", 1);
firstLevel.put("LAS", 2);
int cmp = firstLevel.get(o1.getDir()).compareTo(firstLevel.get(o2.getDir()));
if (cmp != 0) {
return cmp;
}
Map<String, Integer> secondLevel = new HashMap<>();
secondLevel.put("P", 1);
secondLevel.put("T", 2);
cmp = secondLevel.get(o1.getEnv()).compareTo(secondLevel.get(o2.getEnv()));
if (cmp != 0) {
return cmp;
}
Map<String, Integer> thirdLevel = new HashMap<>();
thirdLevel.put("ORD", 1);
thirdLevel.put("DES", 2);
thirdLevel.put("INV", 3);
return thirdLevel.get(o1.getReport()).compareTo(thirdLevel.get(o2.getReport()));
}