Aller au contenu


Photo

trier un tableau composé de 3 NSNumber


  • Please log in to reply
38 réponses à ce sujet

#21 Mick

Mick

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 240 messages
  • LocationEure

Posté 31 mai 2017 - 12:57

Oui, ce n'est pas le problème, je suggérais juste de revoir peut-être l'organisation de la couche "données". Je ne remettais pas en cause les codes proposés ! 



#22 Larme

Larme

    Broyeur de fèves

  • Artisan chocolatier
  • PipPipPipPipPipPip
  • 1 981 messages
  • LocationParis

Posté 31 mai 2017 - 13:06

 

Bonjour,

 

au niveau du modèle, ce ne serait pas plus simple de faire un NSArray de dictionnaires ? Il y a alors un NSArray, et le tri se fait tout seul avec les NSSortDescriptors, non ?Il semble que tu veuilles que ces 3 valeurs soit "un objet", et pas 3 objets indépendants ? Le tableau contient ainsi des triplets de nombres, ce qui évite 3 tableaux différents, à gérer simultanément. Mais après je ne sais pas ce que tu en fais, donc e suis peut-être à coté de la plaque sur tes besoins.

 

 

Quand tu dis ne vouloir trier que par rapport à V1, là, ça me met sur la piste que ton modèle est peut-être erroné. En tout cas, c'est pas clair. J'aurais besoin d'un véritable exemple de code et du résultat final souhaité.

 

Une classe V dont les champs serait V1, V2, V3, ... . Pour le tri il suffit ensuite d'utiliser les méthodes de tri de NSArray (sortusing...) comme l'a indiquer Larme.

;)


Tant que vous avez des dents, mangez des pommes. Tant que vous avez de l'argent, croquez la Pomme.

#23 Fred20

Fred20

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 304 messages

Posté 31 mai 2017 - 13:07

Bravo Mick... c'est exactement ce que je cherchais à faire !!!!



#24 Mick

Mick

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 240 messages
  • LocationEure

Posté 31 mai 2017 - 13:41

Effectivement, Larme, cela avait déjà été dit ! ... Mais la question était "sans créer un objet", "la solution la plus simple", c'est pour ça que j'ai évoqué les NSMutableDictionnary. 



#25 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 31 mai 2017 - 13:46

Plus simple, plus lisible, plus beau, plus moderne, plus mieux et avec une meilleure haleine :

 

 

Avant : 

------

85 7 39

43 14 71

6 26 26

90 63 34

97 81 91

 

Aprés : 

------

6 26 26

43 14 71

85 7 39

90 63 34

97 81 91

 
import UIKit

typealias Triplet = (v1:Int, v2:Int, v3:Int)

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let origine = randomTableau(taille: 5)
        print ("Avant : ")
        afficherTableau(origine)
        
        // $0.v2 < $1.v2 pour trier sur la valeur 2
        // $0.v3 < $1.v3 pour trier sur la valeur 3
        let tri = origine.sorted(by: { $0.v1 < $1.v1 } )
        print ()
        print ("Aprés : ")
        afficherTableau(tri)
        
    }
    
    func afficherTableau(_ tableau:[Triplet]) {
        print ("------")
        for t in tableau {
            print (t.v1, t.v2, t.v3)
        }
    }
    
    func randomTableau(taille:Int) -> [Triplet] {
        var tableau = [Triplet]()
        for _ in 1 ... taille {
            tableau.append(randomTriplet())
        }
        return tableau
    }

    func randomTriplet() -> Triplet {
        let t = Triplet(
            Int(arc4random_uniform(100)),
            Int(arc4random_uniform(100)),
            Int(arc4random_uniform(100))
        )
        return t
    }
   
}


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#26 Mick

Mick

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 240 messages
  • LocationEure

Posté 31 mai 2017 - 13:52

"Plus simple, plus lisible, plus beau, plus moderne" : tout à fait d'accord, et j'en prends "de la graine"

"avec une meilleure haleine" : tout dépend de ce que tu as consommé hier soir ....



#27 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 31 mai 2017 - 13:58

"avec une meilleure haleine" : tout dépend de ce que tu as consommé hier soir ....

 

Si t'as regardé les derniers épisodes de Game of Thrones, tu dois avoir une idée du menu draconien de base.


Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#28 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 31 mai 2017 - 14:03

@Draken - en utilisant les tuples, c'est bien mieux mais mon code était conçu sur le base d'un question de Fred20 en Objective-C ; sinon, j'aurais fait presque la même chose.

 

@Fred20 - Qu'est-ce tu cherchais que la réponse de Mick t'a donné ?



#29 Mick

Mick

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 240 messages
  • LocationEure

Posté 31 mai 2017 - 14:09

@Joanna : je pense qu'il voulait dire que j'avais mis dans le mille  : en fait, les 3 nombres V1 V2 et V3 sont des coordonnées de quelque chose.

 

Autre chose : je ne prétends absolument pas détenir les compétences que tu as en développement, et je cherche simplement a partager ma modeste expérience. J'ai cru apporter une autre réponse adaptée au problème de Fred, à savoir une astuce simple qui ne nécessitait pas de créer une nouvelle classe pour trier des triplets de nombre au lieu de trier 3 tableaux simultanément. Je ne dis pas que c'est propre et que c'est la meilleure solution.

 

Je crois déceler dans tes réponses un soupçon d'agacement, et j'en suis désolé, mais sache que je ne suis pas dans l'esprit de "concours de la meilleure solution", je le perdrais évidemment d'avance, n'étant pas développeur "pro"!



#30 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 31 mai 2017 - 14:11

@Draken - en utilisant les tuples, c'est bien mieux mais mon code était conçu sur le base d'un question de Fred20 en Objective-C ; sinon, j'aurais fait presque la même chose.

Je me doute bien.

Toi tu postes pour aider à résoudre le problème de Fred20.

Moi c'est pour faire de la propagande pro-Swift  >:D


  • Joanna Carter aime ceci

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#31 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 31 mai 2017 - 14:14

@Joanna : je pense qu'il voulait dire que j'avais mis dans le mille  : en fait, les 3 nombres V1 V2 et V3 sont des coordonnées de quelque chose.

 

Du coup, pourquoi pas utiliser une petite struct ?

typedef struct Point3D
{
  CGFloat x, y, z;
} Point3D;


#32 Fred20

Fred20

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 304 messages

Posté 31 mai 2017 - 14:30

@Joanna : Heu....en effet, je cherchais quelque chose de simple.... et avant la réponse de Mick, j'ai utilisé ta solution qui fonctionne très bien... Je pense que Mick apporte une autre solution

 

Merci en tout cas à vous tous



#33 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 31 mai 2017 - 14:48

Hmmm, mais tu as dit que tu ne voulais pas créer un objet. NSDictionary est un objet, dérivé de NSObject.

 

Il faut accéder les dictionnaires par clés et, surtout avec les NSStrings, c'est pas difficile de saisir la mauvaise valeur.

 

Qu'est-ce que t'as contre les objets ?



#34 Fred20

Fred20

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 304 messages

Posté 31 mai 2017 - 15:04

Ah oui....alors je me suis mal exprimé : je voulais en fait éviter de créer un objet perso, donc un fichier .m et.h.....



#35 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 31 mai 2017 - 15:13

Ah oui....alors je me suis mal exprimé : je voulais en fait éviter de créer un objet perso, donc un fichier .m et.h.....

 

Je te l'ai déjà dis: passe à Swift ! Qu'un développeur expérimenté avec des années de bouteille travaille en Objective-C, d'accord, c'est normal. Mais pour un débutant en programmation, il n'y a pas photo, Swift étant vraiment plus simple.

 

Moi aussi les .h et les .m m'agaçait. Maintenant c'est du passé ..

 

Si j'ai posté une solution Swift à ton problème, c'est en partie pour que tu puisse constater à quel point ce langage est plus simple que l'objectif-C.


  • Joanna Carter aime ceci

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#36 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 31 mai 2017 - 15:16

Tu pourrais toujours le mettre avec une autre classe  8--)

 

Mais plus sérieuse, pour la lisibilité de ton code, il vaut l'effort, surtout lorsque tu arrives à revisiter ton code dans un an  :-*



#37 Fred20

Fred20

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 304 messages

Posté 31 mai 2017 - 15:17

Merci à tous  pour tout ces conseils



#38 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 31 mai 2017 - 15:38

Quand même, voilà le code que tu peux copier/coller ; ça m'a mis 5 minutes à faire :

//  Tuple.h

#import <Foundation/Foundation.h>

@interface Tuple : NSObject

@property NSInteger V1;

@property NSInteger V2;

@property NSInteger V3;

- (instancetype)initWithV1:(NSInteger)V1 V2:(NSInteger)V2 V3:(NSInteger)V3;

@end
//  Tuple.m


#import "Tuple.h"


@implementation Tuple

- (instancetype)initWithV1: (NSInteger)V1 V2:(NSInteger)V2 V3:(NSInteger)V3
{
  self = [super init];
  
  if (self)
  {
    self.V1 = V1;
    
    self.V2 = V2;
    
    self.V3 = V3;
  }
  
  return self;
}

@end

Et, pour le test :

{
  NSMutableArray *tableauPrincipal = [NSMutableArray array];
  
  for (int i=0; i < 10; i++)
  {
    Tuple *tuple = [[Tuple alloc] initWithV1:rand() % 100 +1 V2:rand() % 100 + 1 V3:rand() % 100 + 1];
    
    [tableauPrincipal addObject: tuple];
  }
  
  [tableauPrincipal sortUsingComparator:^NSComparisonResult(Tuple * _Nonnull obj1, Tuple * _Nonnull obj2)
   {
     return obj1.V1 > obj2.V1;
   }];
  
  for (Tuple *t in tableauPrincipal)
  {
    NSLog(@"%ld, %ld, %ld", t.V1, t.V2, t.V3);
  }
}

8--)



#39 Fred20

Fred20

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 304 messages

Posté 31 mai 2017 - 18:24

Merci Joanna mais j'avais déjà utilisé le code que tu m'avais donné et pris la peine de m'expliquer, code qui est le même que celui-ci du reste....






0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)