0

The problem is to sort an array of two element arrays based on the absolute difference of the elements of those inner arrays in descending order, so {{1, 3}, {4, 12}, {5, 8} would be sorted as {{4, 12}, {5, 8}, {1, 3}}

I have code like this:

import java.util.Arrays;
import java.util.Comparator;

public class Main {

    public static void main(String[] args) {
        Integer[][] arr = {{1, 3}, {3, 12}, {12, 16}};

        Arrays.sort(arr, Comparator.comparing(arr, (Integer[] a, Integer[] b) -> a[1] + b[1] - a[0] - b[0]);
    }
}

but I get this error. It says "cannot infer functional interface type".

Edit: upon changing the above to

import java.util.Arrays;
import java.util.Comparator;

public class Main {

    public static void main(String[] args) {
        Integer[][] arr = {{1, 3}, {3, 12}, {12, 16}};

        Arrays.sort(arr, Comparator.comparing(a -> a[0] - a[1]));

        for (int i = 0; i < arr.length; i++ ) {
            System.out.print("{" + arr[i][0] + ", " + arr[i][1] + "}, ");
        }
    }
}

I get the desired output, but I was unable to get the reversed() method to work like in this answer. I get this error where it says "Array type expected; found: 'java.lang.Object'"

I suppose my question is mostly answered but if someone could clarify the issue with reversed I'd appreciate it.

Edit: and sorry, I neglected to use Math.abs() as in the context of my problem I know the array is always increasing like {2,3}, {3,6}, {6,8}... etc

dionot
  • 3
  • 3
  • 1
    Please read the Javadoc for `Comparator.comparing` and edit your question to explain why you think the parameters you are passing to it are correct, or to ask a question about what parameters it accepts. – tgdavies Sep 21 '21 at 02:28

1 Answers1

0

Descending:

Arrays.sort(arr, (o1, o2) -> Math.abs(o2[0] - o2[1]) - Math.abs(o1[0] - o1[1]));

Ascending:

Arrays.sort(arr, Comparator.comparingInt(o -> Math.abs(o[0] - o[1])));
zysaaa
  • 1,777
  • 2
  • 8
  • 19