背景
项目中统计类目的列表数据要按照指定的规则进行排序.统计的数据集是按照行业内指定的区域进行数据分组计算,因此相当于就是按照给定集合的指定属性字段进行指定顺序的排序.特此纪要!
问题
如何为集合进行指定顺序的排序?
说明
由于集合分组的依据的数据量是有限的,要按照给定的顺序进行排序,最快的速度就是按照你想要的顺序重新组装一次集合得到你想要的结果. 这里使用FIFO的队列进行解决这个问题.
解决
为了更快的了解这种方案, 下面是平移的一组case.
public class CodeOrder {
// 指定排序顺序的目标队列.
static final BlockingQueue<String> targetQueue = new LinkedBlockingDeque<String>(){{
add("苏州市市");
add("昆山");
add("常熟");
add("张家港");
add("太仓");
add("吴江");
add("吴中");
add("相城");
add("苏州工业园区");
add("苏州高新区");
add("姑苏区");
add("张家港保税区");
}};
public static void main(String[] args) {
// 待排序的数据集.
List<String> list = new ArrayList<>();
list.add("苏州市市场监督管理局");
list.add("苏州市吴中区市场监督管理局");
list.add("苏州市相城区市场监督管理局");
list.add("苏州高新区(虎丘区)市场监督管理局");
list.add("常熟市市场监督管理局");
list.add("张家港市市场监督管理局");
list.add("昆山市市场监督管理局");
list.add("苏州市吴江区市场监督管理局");
list.add("太仓市市场监督管理局");
list.add("江苏省张家港保税区市场监督管理局");
list.add("苏州工业园区市场监督管理局");
list.add("苏州市姑苏区市场监督管理局苏州国家历史文化名城保护区市场监督管理局");
// 重排序后的数据容器.
List<String> data = new LinkedList<>();
// 利用FIFO特性的队列进行数据重排序.
Iterator<String> iterator = targetQueue.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
Optional<String> first = list.stream().filter(f -> f.contains(next)).findFirst();
if (first.isPresent()) {
data.add(first.get());
}
}
// 排序后的数据集.
System.out.println(data);
}
}