List<String> orderings= Stream.of("温度", "运行时间").collect(Collectors.toList());
List<String> target= Stream.of("温度1", "运行时间ss","运行时间", "温度").collect(Collectors.toList());
如上数据源:要排序target。要求最终效果:
List<String> target= Stream.of("温度", "运行时间", "温度1","运行时间ss").collect(Collectors.toList());
缺陷方法:
Ordering ordering = Ordering.explicit(orderings);
List<String> strings = target.stream().sorted(new Comparator<String>() {
@Override
public int compare (String o1, String o2) {
if (target.contains(o1) && target.contains(o2)) {
return ordering.compare(o1, o2);
} else {
return 0;
}
}
}).collect(Collectors.toList());
但是这样,只会排序 含有orderings元素的 数据。求合理灵活便捷优雅(是优雅的,是优雅的,是优雅的,别for循环ifelse)的算法
2 回答
HUH函数
TA贡献1836条经验 获得超4个赞
山不转那水在转。
既然,给出的标准排序 不够数,那就跟 要排序的 数据 对比进行合并,筹够数,那么最终符合我的安排的排序方法。只加多一句代码
这种对比字符串的可能意义不大。但这是简化需求的。实际target是对象,Map就有这个必要了
List<String> orderings= Stream.of("温度", "运行时间").collect(Collectors.toList());
List<String> target= Stream.of("温度1", "运行时间ss","运行时间", "温度").collect(Collectors.toList());
// 补充数据
List<String> newOrdering = Stream.concat(orderings.stream(), target.stream().filter(item -> !orderings.contains(item))).collect(Collectors.toList());
Ordering ordering = Ordering.explicit(newOrdering);
List<String> strings = target.stream().sorted(new Comparator<String>() {
@Override
public int compare (String o1, String o2) {
if (newOrdering.contains(o1) && newOrdering.contains(o2)) {
return ordering.compare(o1, o2);
} else {
return 0;
}
}
}).collect(Collectors.toList());
System.out.println(strings);
最终结果:
[温度, 运行时间, 温度1, 运行时间ss]
慕斯709654
TA贡献1840条经验 获得超5个赞
参照guava
的ExplicitOrdering
类做一些改动就行啦。
List<String> orderings= Stream.of("温度", "运行时间").collect(Collectors.toList());
List<String> target= Stream.of( "运行时间ss","运行时间","3","温度1", "温度").collect(Collectors.toList());
class ExplicitOrdering<T> implements Comparator<T> {
private Map<T,Integer> indexMap = new HashMap();
public ExplicitOrdering(List<T> explicit) {
for (int i = 0; i < explicit.size(); i++) {
indexMap.put(explicit.get(i),i);
}
}
@Override
public int compare(T o1, T o2) {
return rank(o1) - rank(o2);
}
private int rank(T value) {
Integer rank = indexMap.get(value);
if (rank == null) {
return Integer.MIN_VALUE;
}
return rank;
}
}
List<String> strings = target.stream().sorted(new ExplicitOrdering<>(orderings).thenComparing(Comparator.naturalOrder())).collect(Collectors.toList());
System.out.println(strings);
添加回答
举报
0/150
提交
取消