如题,今天在学习if-else优化方法的时候,看到一个朋友的评论,特地实现了一下来提高自己对优化方法的理解。
优化方法学习博客:https://www.cnblogs.com/jay-huaxiao/p/12586598.html
在上面的博客里,评论中一位朋友想要将下面的代码进行优化:
let seat = graphChartList[graphChartList.length - 1]
if (element.srcType === 0) {
if (index < 5) {
seat.x = 600
seat.y = (element.srcIp && element.dstIp) ? index * 120 : 600
} else if (index < 10) {
seat.x = 400
seat.y = (element.srcIp && element.dstIp) ? (index - 5) * 120 : 600
} else if (index < 15) {
seat.x = 200
seat.y = (element.srcIp && element.dstIp) ? (index - 10) * 120 : 600
} else {
seat.x = 0
seat.y = (element.srcIp && element.dstIp) ? (index - 15) * 120 : 600
}
} else if (element.srcType === 1) {
seat.x = 800
seat.y = (element.srcIp && element.dstIp) ? 300 : 600
} else if (element.srcType === 2) {
seat.x = 1000
seat.y = (element.srcIp && element.dstIp) ? (length - (index)) * 150 : 600
} else if (element.srcType === 3) {
seat.x = 1200
seat.y = (element.srcIp && element.dstIp) ? 300 : 600
}
首先声明,这一段代码应该是JavaScript代码,但是我用的是Java的方式来处理这段代码。
我的主要思路是表驱动法 + for循环
来优化大量的if-else。
emmmm 虽然我并不知道详细的数据关系,但比葫芦画瓢,我创建了Element、Seat类,如下:
// Element类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Element {
private Integer srcType;
private Boolean srcIp;
private Boolean distIp;
}
// Seat类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Seat {
private Integer x;
private Integer y;
}
主测试类:
public class IfElseOptimization {
public static void main(String[] args) {
Element element = new Element(1, true, true);
Seat seat = getSeat(element, 6, 20);
System.out.println("seat = " + seat);
}
public static Seat getSeat(final Element element, final Integer index, final Integer length) {
// data
final int[] indexes = {5, 10, 15};
Map<Integer, Supplier<Seat>> srcTypeMap = new HashMap<>();
Map<Integer, Supplier<Seat>> indexMap = new HashMap<>();
// init index map
indexMap.put(5, () -> new Seat(600, (element.getSrcIp() && element.getDistIp()) ? index * 120 : 600));
indexMap.put(10, () -> new Seat(400, (element.getSrcIp() && element.getDistIp()) ? (index - 5) * 120 : 600));
indexMap.put(15, () -> new Seat(200, (element.getSrcIp() && element.getDistIp()) ? (index - 10) * 120 : 600));
indexMap.put(-1, () -> new Seat(0, (element.getSrcIp() && element.getDistIp()) ? (index - 15) * 120 : 600));
// init src type map
srcTypeMap.put(0, () -> {
int key = -1;
for (int value : indexes) {
if (index < value) {
key = value;
break;
}
}
return indexMap.get(key).get();
});
srcTypeMap.put(1, () -> new Seat(800, (element.getSrcIp() && element.getDistIp()) ? 300 : 600));
srcTypeMap.put(2, () -> new Seat(1000, (element.getSrcIp() && element.getDistIp()) ? (length - (index)) * 150 : 600));
srcTypeMap.put(3, () -> new Seat(1200, (element.getSrcIp() && element.getDistIp()) ? 300 : 600));
// invoke
return srcTypeMap.get(element.getSrcType()).get();
}
}
hhhhhhhhh,真就强行优化呗~
不过目标也算是勉强完成了,减少了大量出现的if-else。