#java #arrays
#java #массивы
Вопрос:
Я пытаюсь отсортировать двумерный массив на основе второго столбца, вот массив:
[1.1, 60.0]
[1.2, 66.66]
[1.3, -1.0]
[1.4, 50.0]
[1.5, 100.0]
[2.1, -1.0]
[2.2, -1.0]
[2.3, -1.0]
Я изучил сортировку многомерных массивов и создал следующий код:
private void sortKnowledgeScores(double[][] knowledgescores){
Arrays.sort(knowledgescores, new Comparator<double[]>() {
@Override
public int compare(double[] o1, double[] o2) {
double itemOne = o1[1];
double itemTwo = o2[1];
// sort on item id
if(itemOne < itemTwo){
return (int) itemOne;
}
return (int) itemIdTwo;
}
Это приводит к преобразованию массива в это:
[2.3, -1.0]
[2.2, -1.0]
[2.1, -1.0]
[1.3, -1.0]
[1.1, 60.0]
[1.2, 66.66]
[1.4, 50.0]
[1.5, 100.0]
Что верно для первых трех значений, однако оно ставит 50 ниже 60 и 60,66. Как я могу настроить свою функцию sortKnowledgeScores для сортировки моего массива на основе первого столбца в порядке возрастания?
Ответ №1:
Компаратор должен возвращать 1,0, -1 (как больше, равно, меньше).
Как правило, если функция сравнения возвращает положительный результат, первый элемент больше, 0 они равны, а отрицательный результат означает, что второй объект больше.
Вы возвращаете значения, а не результат сравнения.
Вы можете посмотреть этот документ
Вам нужно изменить свой код на:
public int compare(double[] o1, double[] o2) {
return (int) o1[1] - o2[1];
}
Как указывает @Mick — обратите внимание, что вы используете индекс: индекс 0 для первого столбца, а индекс 1 для второго
Комментарии:
1. o1 [0] — o2 [0], я думаю
2. это зависит от OP — я знаю, что он сказал «первый» col, что означает индекс 0, но в коде и объяснении он говорит о втором col, поэтому я сохраняю
1
индекс здесь. Это хороший комментарий, если он действительно это имеет в виду, но я не думаю, что это была его проблема3. Это моя ошибка, я имел в виду второй столбец, который будет иметь индекс 1
Ответ №2:
Прежде всего, вы используете неправильный индекс. Первый элемент в массиве имеет индекс 0
Вы можете использовать Comparator-Factory Comparator.comparingDouble
:
Comparator.comparingDouble(array -> array[0])
Arrays.sort(knowledgescores, Comparator.comparingDouble(array -> array[0]))
Ответ №3:
Вы сравниваете элементы с индексом «1». Это переводится во второй столбец. Вы должны использовать индекс «0», если сортировка должна учитывать первый столбец.
Плюс, как уже упоминалось, метод сравнения работает следующим образом:
Сравнивает этот объект с указанным объектом для упорядочения. Возвращает отрицательное целое число, ноль или положительное целое число, поскольку этот объект меньше, равен или больше указанного объекта.