Как отсортировать массив, какой элемент наиболее распространен на первый взгляд? - PullRequest
0 голосов
/ 07 сентября 2018

например, предположим, у меня есть массив: [3,2,2,1,4,5,3,2,2,1,1], который я хочу отсортировать в эту форму:

[2,2,2,2,1,1,1,3,3,4,5]

какой 2 является наиболее распространенным элементом, затем 1 и т. Д., Как мне написать функцию сортировки:

let arr=[3,2,2,1,4,5,3,2,2,1,1];
arr.sort(function(p0,p1){
  //how to write it?
});

чтобы сделать это?

Я пытался:

 let arr=[3,2,2,1,4,5,3,2,2,1,1];
 let numPosMap=new Map();
 for(let i=0;i<arr.length;i++){
     let num=arr[i];
     if(!numPosMap[num]){
         numPosMap[num]=[];
     }
     numPosMap[num].push(i);
 }
 let posArrayArray=[];
 for(let num in numPosMap) {
     posArrayArray.push(numPosMap[num]);
 }
 posArrayArray.sort(function(a,b){
   return a.length<b.length;
 });

 let resultArr=[];
 for(let posArray of posArrayArray){
   for(let pos of posArray){
     resultArr.push(pos);
   }
 }

, который имеет много строк кодов, есть ли более простой метод?

1 Ответ

0 голосов
/ 07 сентября 2018

Я бы порекомендовал создать еще один объект, который подсчитывает, сколько каждого элемента появится в вашем массиве. Когда у вас есть это, вы можете сортировать, сравнивая количество каждого элемента.

Пример:

let arr = [3, 2, 2, 1, 4, 5, 3, 2, 2, 1, 1];

// Do some preprocessing first...
let counts = arr.reduce((counts, num) => {
  counts[num] = (counts[num] || 0) + 1;
  return counts;
}, {});

console.log(counts);

arr.sort(function(p0,p1){
  return counts[p1] - counts[p0];
});

console.log(arr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...