Java Comparator-klasse om arrays te sorteren

Stel, we hebben de volgende 2-dimensionale array:

int camels[][] = new int[n][2];

Hoe moet de Java Comparator-klasse worden gedeclareerd om de arrays op hun eerste elementen in aflopende volgorde te sorteren met behulp van Arrays.sort(camels, comparator)? De functie compareter referentie is:

@Override public int compare(int[] a, int [] b)
{
    return b[0] - a[0];
}

Antwoord 1, autoriteit 100%

[…] Hoe moet de Java Comparator-klasse worden gedeclareerd om de arrays te sorteren op hun eerste elementen in aflopende volgorde[…]

Hier is een compleet voorbeeld met Java 8:

import java.util.*;
public class Test {
    public static void main(String args[]) {
        int[][] twoDim = { {1, 2}, {3, 7}, {8, 9}, {4, 2}, {5, 3} };
        Arrays.sort(twoDim, Comparator.comparingInt(a -> a[0])
                                      .reversed());
        System.out.println(Arrays.deepToString(twoDim));
    }
}

Uitvoer:

[[8, 9], [5, 3], [4, 2], [3, 7], [1, 2]]

Voor Java 7kunt u het volgende doen:

Arrays.sort(twoDim, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        return Integer.compare(o2[0], o1[0]);
    }
});

Als je ongelukkig genoeg bent om op Java 6of ouder te werken, zou je het volgende doen:

Arrays.sort(twoDim, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        return ((Integer) o2[0]).compareTo(o1[0]);
    }
});

Antwoord 2, autoriteit 9%

Het antwoord van @aioobe is uitstekend. Ik wil gewoon een andere manier toevoegen voor Java 8.

int[][] twoDim = { { 1, 2 }, { 3, 7 }, { 8, 9 }, { 4, 2 }, { 5, 3 } };
Arrays.sort(twoDim, (int[] o1, int[] o2) -> o2[0] - o1[0]);
System.out.println(Arrays.deepToString(twoDim));

Voor mij is het intuïtief en gemakkelijk te onthouden met Java 8-syntaxis.


Antwoord 3, autoriteit 6%

Ik heb deze oplossing net geprobeerd, we hoeven niet eens int te schrijven.

int[][] twoDim = { { 1, 2 }, { 3, 7 }, { 8, 9 }, { 4, 2 }, { 5, 3 } };
Arrays.sort(twoDim, (a1,a2) -> a2[0] - a1[0]);

Dit ding werkt ook, het detecteert automatisch het type string.

Other episodes