Как отсортировать массив, затем взять индекс и использовать индекс для перемещения всех соответствующих элементов?

#javascript #arrays #sorting

#javascript #массивы #сортировка

Вопрос:

У меня есть 5 разных массивов, которые имеют одинаковый индекс, например:

 person[0]="john", address[0]= "Druid Valley", city[0]="Atlanta", amount[0]=2000, need[0]=100; 
person[1]="emily", address[1]="50 decatur", city[1]="Chicago", amount[1]=300; need[1]=50;
  

Мне нужно изменить порядок всех массивов в порядке убывания массива need[], затем изменить порядок других массивов на основе нового индекса для need [i]. Я использую javascript.

Спасибо,

Джон

Ответ №1:

Отсортируйте need массив и сохраните перестановку сортировки, затем примените эту перестановку к другим массивам. Как именно вы это делаете, зависит от языка, который вы используете. Например, функция Matlab sort может возвращать как отсортированный массив, так и перестановку сортировки.

Ответ №2:

Не сортируйте «нужно». Создайте массив индексов, затем отсортируйте его в соответствии с потребностями. Однако вы не указали язык, поэтому вы получаете JavaScript:

 var person = [], need = [];

var person = ["E", "B", "A", "C", "D"];
var need = [111, 444, 555, 333, 222];

var index = [];
var i = person.length;
while (i--) {
  index.push(i);
}
var comparator = function(a, b) {
  var need_a = need[a];
  var need_b = need[b];

  // For robustness - non-numbers get sorted last:
  if (typeof need_a != 'number' || isNaN(need_a)) need_a = -Infinity;
  if (typeof need_b != 'number' || isNaN(need_b)) need_b = -Infinity;

  if (need_a < need_b) return 1;
  if (need_b < need_a) return -1;
  return 0;
}
index.sort(comparator);

// at this point, person[index[0]] is the person with the biggest need.

var sorted_person = [];
var i = index.length;
while (i--) {
  sorted_person[i] = person[index[i]];
}

// at this point, sorted_person[0] is the person with the biggest need.

console.log(sorted_person);
  

Комментарии:

1. Спасибо, Амадан, это был язык Javascript (который я должен был указать с самого начала) — как бы я мог использовать это для изменения порядка всех массивов одновременно, а не только person? Мне нужно что-то, что изменило бы порядок их всех одновременно (при циклическом перемещении по элементам).

2. Вам, вероятно, не нужно — просто используйте исходные массивы с index индексом, как я показываю в последней строке. Если они вам действительно нужны в виде отсортированных массивов, создание новых было бы проще: var i = index.length; var sorted_person = [], sorted_address = []; while (i--) { sorted_person[i] = person[index[i]]; sorted_address[i] = address[index[i]]; }

3. Я пробовал это, сортировка не работает, я получаю значения, которые не отсортированы.

4. Эмм, здесь работает. Я обновлю код, чтобы показать добавленный бит, и заменю ваши массивы чем-нибудь, где легче увидеть результат.

5. Спасибо, Амадан, ваш код работает с тем, что вы написали. Проблема в том, что я заметил, что из, скажем, ~ 800 элементов может быть ~ 20-50, которые либо будут иметь «NaN» (они были взяты из веб-формы, и parseFloat не работал, поскольку в то время они, вероятно, были пустыми полями). Что я должен изменить, чтобы разрешить такие значения в need[]?

Ответ №3:

создайте массив копирования, который будет иметь те же значения, что и в массиве need (назовем его sorted array). затем посмотрите на исходный массив need — и для каждой ячейки найдите, где она находится в отсортированном массиве, и поместите соответствующие значения из других массивов в тот же номер ячейки, который они отображают в отсортированном массиве

Комментарии:

1. Не могли бы вы, пожалуйста, вставить код, который бы делал то, что вы говорите? Я новичок, и практические детали помогают мне разобраться. Спасибо.