用java从列表中获取所需输出的效率如何?
现在,我必须创建一个列表,其中包含以下条件的记录:用java从列表中获取所需输出的效率如何?,java,list,collections,java-8,Java,List,Collections,Java 8,现在,我必须创建一个列表,其中包含以下条件的记录: 在每个电路id中,我需要获得最高小时数的记录,但如果存在重复的小时数,我需要与电力部门一起获取记录 上述结果的结果应如下所示: CircuitID Department Hours -------------------------------- Circuit A Electricity 60 Circuit A Hydel 70 Circuit B Hydel
CircuitID Department Hours
--------------------------------
Circuit A Electricity 60
Circuit A Hydel 70
Circuit B Hydel 30
Circuit C Electricity 40
Circuit B Electricity 80
Circuit C Hydel 50
Circuit A Electricity 70
让我知道如何使用Java8/java以最有效的方式进行迭代以获得最终列表
我写的代码一点也不完美,我的方法如下所示:
Circuit A Electricity 70
Circuit B Electricity 80
Circuit C Hydel 50
公共静态映射getMaxHours(最终列表电路列表){
最终映射mappedCircuitsById=新HashMap();
用于(最终回路:回路列表){
如果(!mappedCircuitsById.containsKey(circuit.getCircuitID())){
mappedCircuitsById.put(circuit.getCircuitID(),circuit);
}否则{
最终电路存在max=mappedCircuitsById.get(Circuit.getCircuitID());
if(circuit.getHours()>existingMax.getHours())mappedCircuitsById.put(circuit.getCircuitID(),circuit);
else if(circuit.getHours()==existingMax.getHours()){
if(circuit.getDepartment()等于(“电”)mappedCircuitsById.put(circuit.getCircuitID(),circuit);
else如果(existingMax.getDepartment().equals(“电”))mappedCircuitsById.put(circuit.getCircuitID(),existingMax);
}
}
}
返回MappedCircuitsByd;
}
创建一个映射,其中映射的键是
电路ID
,值是满足“最大小时”要求的电路
对象。迭代列表中的元素,并相应地更新映射以存储新的“最大小时数”电路
对象您可以通过带合并功能的toMap()
采集器来执行此操作
public static Map<String, Circuit> getMaxHours(final List<Circuit> circuitsList) {
final Map<String, Circuit> mappedCircuitsById = new HashMap<String, Circuit>();
for (final Circuit circuit : circuitsList) {
if (!mappedCircuitsById.containsKey(circuit.getCircuitID())) {
mappedCircuitsById.put(circuit.getCircuitID(), circuit);
} else {
final Circuit existingMax = mappedCircuitsById.get(circuit.getCircuitID());
if (circuit.getHours() > existingMax.getHours()) mappedCircuitsById.put(circuit.getCircuitID(), circuit);
else if (circuit.getHours() == existingMax.getHours()) {
if (circuit.getDepartment().equals("Electricity")) mappedCircuitsById.put(circuit.getCircuitID(), circuit);
else if (existingMax.getDepartment().equals("Electricity")) mappedCircuitsById.put(circuit.getCircuitID(), existingMax);
}
}
}
return mappedCircuitsById;
}
Map Map=circuitList
.stream()
.collect(Collectors.toMap(Circuit::getCircuitID,Function.identity(),merge));
合并功能是:
Map<String, Circuit> map = circuitList
.stream()
.collect(Collectors.toMap(Circuit::getCircuitID, Function.identity(),merge));
BinaryOperator合并=(左、右)->{
如果(left.hours>right.hours)返回left;
否则如果(left.hours
并得到最终结果:
BinaryOperator<Circuit> merge = (left, right) -> {
if (left.hours > right.hours) return left;
else if (left.hours < right.hours) return right;
//if (left.department.equals("Electricity")) return left;
if (right.department.equals("Electricity")) return right;
return left;
};
List result=newarraylist(map.values());
我们必须首先根据CircuitID进行分组,并根据我们的要求编写自定义比较器进行过滤。可按如下所示进行:
List<Circuit> result = new ArrayList<>(map.values());
List filteredList=new ArrayList();
list.stream().collect(Collectors.groupingBy(Circuits::getCircuitID)).forEach((key,value)->filteredList.add(compare(value));
专用静态电路比较(列表){
电路=零;
用于(电路c:列表){
if(null==电路){
电路=c;
}
if(c.getHours()>circuits.getHours()){
电路=c;
}else if(c.getHours()==circuits.getHours()){
电路=c.getDepartment().等效信号(“电”)?c:电路;
}
}
回路;
}
首先编写一个自定义比较器,检查最高小时数,并评估重复小时数情况,以使用电力
部门:
List<Circuits> filteredList = new ArrayList<>();
list.stream().collect(Collectors.groupingBy(Circuits::getCircuitID)).forEach((key, value) -> filteredList.add(compare(value)));
private static Circuits compare (List<Circuits> list) {
Circuits circuits = null;
for (Circuits c : list) {
if (null == circuits) {
circuits = c;
}
if (c.getHours() > circuits.getHours()) {
circuits = c;
} else if (c.getHours() == circuits.getHours()) {
circuits = c.getDepartment().equalsIgnoreCase("Electricity") ? c : circuits;
}
}
return circuits;
}
请显示
电路
类的外观。另外,如果您更正了诸如getCircuitId
、getCircuitId()
、“电”
、circuitList()
以及缩进和右括号之类的打字错误,那就太好了。请使用groupingBy
按电路收集。使用下游的maxBy
和收集器排序,首先按小时排序,然后按类型排序。如果(left.department.equals(“电”)返回left,则可以删除代码>全部检查。为什么不干脆maxBy
?@Boristeider,是的,我也想过了<代码>比较器比较器=比较器。比较(电路::getHours)。然后比较(电路->电路。电路ID。等于(“电”)?1:-1)然后Map=circuitList.stream().collect(Collectors.groupingBy(Circuit::getCircuitID,Collectors.maxBy(comparator))代码>你的比较器是错误的,因为它从不返回0
-但是,是的,类似的东西。@Joka Leeresult.forEach(circuit->System.out.printLn(“[circuit id:+circuit.CircuitID+”部门:“+circuit.Department+”小时:“+circuit.Hours+”)代码>
List<Circuit> result = new ArrayList<>(map.values());
List<Circuits> filteredList = new ArrayList<>();
list.stream().collect(Collectors.groupingBy(Circuits::getCircuitID)).forEach((key, value) -> filteredList.add(compare(value)));
private static Circuits compare (List<Circuits> list) {
Circuits circuits = null;
for (Circuits c : list) {
if (null == circuits) {
circuits = c;
}
if (c.getHours() > circuits.getHours()) {
circuits = c;
} else if (c.getHours() == circuits.getHours()) {
circuits = c.getDepartment().equalsIgnoreCase("Electricity") ? c : circuits;
}
}
return circuits;
}
Comparator<Circuit> cmp = new Comparator<Circuit>() {
@Override
public int compare(Circuit o1, Circuit o2) {
int compare = Integer.compare(o1.getHours(), o2.getHours());
if(compare==0) { // equal hours so check for department
// the element with 'Electricity' value must seem to be have max value
if(o1.getDepartment().equals("Electricity")) {
compare = 1;
}
if(o2.getDepartment().equals("Electricity")) {
compare = -1;
}
}
return compare;
}
};
Map<String, Optional<Circuit>> resultMap = circuitList.stream().collect(
Collectors.groupingBy(Circuit::getCircuitId, Collectors.maxBy(cmp)));
Collection<Optional<Circuit>> result = resultMap.values();
result.forEach(x -> System.out.println(x.get().getCircuitId() + " " + x.get().getDepartment() + "\t" + x.get().getHours()));