2016-09-19 1 views
-2

Comment faire pour trier Array Of DashboardObjectAIR objet Si supposer tout objet de tableau contient arround 0 ou 1 emplacement "UnOk" alors il devrait montrer top.Comment trier Array of object list En java?

Pour ci-dessous tempObj Liste le airObj devrait dans l'emplacement 0 dans la liste, car il contient "UnOk".

DashboardObjectAIR[] airObj = new DashboardObjectAIR[2]; 

airObj[0] = new DashboardObjectAIR("UnOk"); 

airObj[1] = new DashboardObjectAIR("Ok"); 

airObj1[0] = new DashboardObjectAIR("Ok"); 

airObj1[1] = new DashboardObjectAIR("Ok"); 

List<DashboardObjectAIR[]> tempObj = new ArrayList<DashboardObjectAIR[]>(); 

tempObj.add(airObj); 
tempObj.add(airObj1); 

Comment puis-je régler ce problème scnarion:

Tout le monde peut me aider s'il vous plaît?

+0

Peut-on avoir l'implémentation de DashboardObjectAIR..Basically DashboardObjectAIR devrait implémenter un comparateur ou vous pouvez ajouter un comparateur pour comparer les classes DashboardObjectAIR dans la classe actuelle – Fayaz

+2

Eh bien, vous avez déjà choisi le ** mot-clé ** que vous devez savoir à propos de: * comparateur *. Donc, vous savez déjà quel sujet à rechercher. Avez-vous vraiment besoin de nous pour le faire pour vous? – GhostCat

+0

@GhostCat Pouvez-vous expliquer comment implémenter cela? – Sitansu

Répondre

1

Essayez ci-dessous

en supposant que le tableau aura un minimum d'éléments 2, si pas d'ajouter des contrôles aux limites

DashboardObjectAIR[] airObj = new DashboardObjectAIR[2]; 
    airObj[0] = new DashboardObjectAIR("UnOk"); 
    airObj[1] = new DashboardObjectAIR("Ok"); 
    DashboardObjectAIR[] airObj1 = new DashboardObjectAIR[2]; 
    airObj1[0] = new DashboardObjectAIR("Ok"); 
    airObj1[1] = new DashboardObjectAIR("Ok"); 
    DashboardObjectAIR[] airObj3 = new DashboardObjectAIR[2]; 
    airObj3[0] = new DashboardObjectAIR("Ok"); 
    airObj3[1] = new DashboardObjectAIR("Ok"); 
    DashboardObjectAIR[] airObj4 = new DashboardObjectAIR[2]; 
    airObj4[0] = new DashboardObjectAIR("Ok"); 
    airObj4[1] = new DashboardObjectAIR("UnOk"); 

    List<DashboardObjectAIR[]> listOfArray = new ArrayList<DashboardObjectAIR[]>(); 
    listOfArray.add(airObj); 
    listOfArray.add(airObj1); 
    listOfArray.add(airObj3); 
    listOfArray.add(airObj4); 

    Comparator<DashboardObjectAIR[]> c = (a1, a2) -> { 
     int comp = a2[0].getOk().compareTo(a1[0].getOk()); // note a2 - a1 to have Unok before Ok 
     if (comp == 0) 
      return a2[1].getOk().compareTo(a1[1].getOk()); 
     else 
      return comp; 
    }; 
    List<DashboardObjectAIR[]> sorted = listOfArray.stream().sorted(c).collect(Collectors.toList()); 
    sorted.forEach(arr -> System.out.println(Arrays.toString(arr))); 

sortie

[DashboardObjectAIR [ok=UnOk], DashboardObjectAIR [ok=Ok]] 
[DashboardObjectAIR [ok=Ok], DashboardObjectAIR [ok=UnOk]] 
[DashboardObjectAIR [ok=Ok], DashboardObjectAIR [ok=Ok]] 
[DashboardObjectAIR [ok=Ok], DashboardObjectAIR [ok=Ok]] 

Edit-1

Tableau de taille inconnue [Merci @Andreas]

Comparator<DashboardObjectAIR[]> c1 = (a1, a2) -> { 
     return Arrays.stream(a2).map(DashboardObjectAIR::getOk).sorted().collect(Collectors.joining()) 
       .compareTo(Arrays.stream(a1).map(DashboardObjectAIR::getOk).sorted().collect(Collectors.joining())); 

    }; 
+0

Vous utilisez silencieusement l'astuce du tri par Chaîne * décroissante *, en inversant l'utilisation de 'a2' et' a1' dans 'Comparator'. C'est une chose tellement facile à négliger, et pourrait être une erreur, que vous devriez toujours documenter (commenter) en appliquant des trucs comme ça. À tout le moins, vous auriez dû expliquer dans la réponse. – Andreas

+0

@Andreas Merci, ajoutera des commentaires – Saravana

+0

Méfiez-vous également que la tâche était de trier les tableaux qui contient "UnOk" en premier. Ce code va trier '[UnOk, Ok]' avant '[Ok, UnOk]', ce qui peut ne pas être souhaitable si l'ordre d'origine reste intact. – Andreas

1

Par souci de simplicité, je suppose que DashboardObjectAIR a une méthode boolean isOk(), pour vérifier si l'objet est « UnOk » ou « Ok ».

Le but est de trier un List<DashboardObjectAIR[]> de sorte que les tableaux contenant un objet "UnOk" DashboardObjectAIR soient triés en premier.

On peut utiliser le fait que Boolean.compareTo() sortes false avant true, donc si nous pouvons obtenir une valeur false pour une DashboardObjectAIR[] qui a un objet « UnOk », alors il sera facile.

Utilisation de Java 8 cours d'eau, on peut facilement le faire de cette façon:

tempObj.sort(Comparator.comparing(a -> Arrays.stream(a).allMatch(DashboardObjectAIR::isOk))); 

Ici, nous trier la liste en examinant chaque élément de la liste. L'élément est affecté à a de type DashboardObjectAIR[] et nous vérifions ensuite si tous les objets du tableau sont "Ok". Si oui, nous retournons true (trier en dernier), sinon nous retournons false (tri en premier).

Ceci fonctionnera pour les listes et les tableaux de n'importe quelle taille.

+0

Je pense que nous allons vérifier 'anyMatch' parce que même si un élément dans array contient 'UnOk' il devrait venir en premier – Saravana

+0

@Saravana C'est pourquoi' allMatch() 'est utilisé, car il retournera' false' (trier d'abord) si l'appel de * any * 'isOk' renvoie false. Ce n'est que lorsque * tous * les éléments du tableau 'isOk' retournent true et trient en dernier. – Andreas

+0

ouais, j'ai compris, l'implémentation sera la même, retournant la valeur de retour, non? – Saravana