Dart中按元素出现频次对多列表元素进行排序
按元素在多个列表中的出现次数排序
需要把多个列表里的元素,按照它们出现在不同列表中的次数(即被多少个列表包含)降序排序;如果出现次数相同,则按照元素在第一个列表中的出现顺序排列。
输入示例
var list1 = ["a", "b", "c", "d"]; var list2 = ["a", "c"]; var list3 = ["c", "d"]; var list4 = ["d"];
期望输出
["c", "a", "d", "b"]
排序逻辑
c出现在3个列表(list1、list2、list3)中,次数最多,排首位;a出现在2个列表(list1、list2)中,排第二位;d同样出现在3个列表(list1、list3、list4)中,但在第一个列表里a的位置比d靠前,所以a排在d之前;b只在list1中出现,次数最少,排末位。
实现步骤
- 收集所有唯一元素:把所有列表的元素合并后去重,得到需要排序的全部元素;
- 统计出现次数:遍历每个元素,统计它被多少个输入列表包含;
- 自定义排序:先按出现次数降序,次数相同时按第一个列表里的元素顺序升序。
JavaScript 实现代码
// 把所有输入列表放到一个数组里,方便统一处理 const inputLists = [ ["a", "b", "c", "d"], ["a", "c"], ["c", "d"], ["d"] ]; // 1. 获取所有唯一元素 const uniqueElements = [...new Set(inputLists.flat())]; // 2. 统计每个元素出现在多少个列表中 const occurrenceCount = uniqueElements.reduce((countMap, element) => { const count = inputLists.filter(list => list.includes(element)).length; countMap[element] = count; return countMap; }, {}); // 3. 按规则排序 const firstList = inputLists[0]; const sortedResult = uniqueElements.sort((a, b) => { // 优先按出现次数降序 if (occurrenceCount[b] !== occurrenceCount[a]) { return occurrenceCount[b] - occurrenceCount[a]; } // 次数相同时,按第一个列表中的位置排序 return firstList.indexOf(a) - firstList.indexOf(b); }); console.log(sortedResult); // 输出: ["c", "a", "d", "b"]
代码说明
inputLists.flat()把嵌套列表转成一维数组,再用Set去重得到唯一元素;reduce结合filter统计每个元素的列表出现次数;sort方法自定义排序逻辑,完美匹配需求中的排序规则。
内容的提问来源于stack exchange,提问作者Rustam Usmanov
相关产品推荐
相关产品推荐

