IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Tri d'un tableau associatif en bash


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Points : 40
    Points
    40
    Par défaut Tri d'un tableau associatif en bash
    Salut
    J'ai ce tableau associative (un exemple):
    A = [ [14.52 44.22 --> 28.42063510901893972662],
    [55.88 88.55 --> 83.77926354414915719598],
    [1.1 1.1 --> 19.77682734919835416622] ]

    Comment trier le tableau "A" dans l'ordre croissant des valeurs ?

    A = [ [1.1 1.1 --> 19.77682734919835416622],
    [14.52 44.22 --> 28.42063510901893972662],
    [55.88 88.55 --> 83.77926354414915719598] ]

    Merci

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Bonjour,

    Juste une question: comment crées tu ton tableau associatif en bash ?

    Après, comme le bash ne comprend pas les flottants, un petit descriptif du format de tes valeurs pourrait peut-être simplifier le tri, comme par exemple, font-ils tous la même taille (ont-ils tous autant de chiffre avant la virgule et autant de chiffre après la virgule) ?
    Cordialement.

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    Bonjour,

    de toute évidence, tu n'as rien du tout !
    ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A = [ [14.52 44.22 --> 28.42063510901893972662],
    [55.88 88.55 --> 83.77926354414915719598],
    [1.1 1.1 --> 19.77682734919835416622] ]
    ce n'est pas un tableau associatif bash.
    je ne sais pas ce c'est.

    faites un minimum de tests avant de poster des questions !!!
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    de toute évidence, tu n'as rien du tout !
    ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    A = [ [14.52 44.22 --> 28.42063510901893972662],
    [55.88 88.55 --> 83.77926354414915719598],
    [1.1 1.1 --> 19.77682734919835416622] ]
    ce n'est pas un tableau associatif bash.
    je ne sais pas ce c'est.
    une chaîne de caractères déjà mais....

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 101
    Points : 4 446
    Points
    4 446
    Par défaut
    en bash , les tableaux associatifs ne peuvent pas être triés, l'ordre est figé avec un parcours for .. in
    $moi= ( !== ) ? : ;

  6. #6
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Points : 40
    Points
    40
    Par défaut
    L'exemple que j'ai donnée est un pseudo code, n'est pas un tableau associatif en bash.
    Mais le tableau est crée en exécution.

    Voici le code complet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    #!/bin/bash
    declare -A coordDist
    declare -A exist
     
    sosBoat() {
      xd=""
      yd=""
      regex='^-?[0-9]+([.][0-9]+)?$'
      while [[ ! $xd =~ $regex || ! $yd =~ $regex ]]
      do
        read -p "Xd= " xd
        read -p "Yd= " yd
      done
    }
     
    nbBoats() {
      while
          read -p "N = " n
          [[ ! "$n" =~ ^[0-9]+$ ]] || [[ $n -le 0 ]] || [[ $n -gt 10 ]]
      do :; done
    }
     
    fill() {
      nbBoats=$1
      for i in `seq 0 $(($nbBoats-1))`; do
        regex='^-?[0-9]+([.][0-9]+)?$'
        while
          echo "Bateau #"$i
          read x y
          [[ ! $x =~ $regex || ! $y =~ $regex ]] || (( $(echo "$x==$xd" | bc -l) )) && (( $(echo "$y==$yd" | bc -l) )) || [[ -n "${exist[$x $y]}" ]]
        do :; done
        exist[$x $y]=1
        dist=$(echo "sqrt (($y-$yd)^2+($x-$xd)^2)" | bc -l)
        coordDist[$x $y]=$dist
      done
    }
     
    display(){
      nbBoats=$1
      for i in `seq 0 $(($nbBoats-1))`
      do
        echo  " (${tx[$i]},${ty[$i]})"
      done
    }
     
     
    displayArray(){
      for i in "${!coordDist[@]}"
    do
      echo "$i --> ${coordDist[$i]}"
    done
    }
     
    sosBoat
    nbBoats
    fill n
    displayArray
     
    #for k in "${!coordDist[@]}"
    #do
      #  echo $k ' - ' ${coordDist["$k"]}
    #done |
    #sort -rn -k3
     
     
    #displayArray
    exemple d’exécution:
    Nom : Sélection_022.png
Affichages : 1106
Taille : 13,2 Ko

    Le programme met dans le tableau les coordonnées de chaque bateau (comme étant un clé) associé à la distance qui sépare le bateau en question et le bateau de coordonnées (xd yd).
    Je veux savoir Comment trier le tableau "coordDist" dans l'ordre croissant des valeurs ?

    Comment peut-t-on avoir ce résultat ? :
    12.33 12.44 --> 33.39993413167157729507
    45.66 78.99 --> 45.65602917468841814389
    1.1 1 --> 46.69348241457259310977


    Merci

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 278
    Points : 12 726
    Points
    12 726
    Par défaut
    Si c'est juste pour l'affichage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    displayArray(){
      for i in "${!coordDist[@]}"
    do
      echo "$i --> ${coordDist[$i]}"
    done | sort -n -k4
    }
    Devrait le faire, mais est-ce bien ce que tu veux ?
    Cordialement.

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 383
    Points
    19 383
    Par défaut
    à part ça :

    • attention, les variables assignées dans les fonctions sont globales, à moins d'être déclarées explicitement, ou d'être locale.
    • il y a un problème dans la fonction nbBoats() : en fait, c'est
      Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      tant que condition pas OK #ou jusqu'à ce que condition OK (until)
         lire les données
      finTant
    • le tableau exist est inutile, car de toute façon tu testeras s'il existe une valeur pour l'index, donc, autant directement tester s'il existe une valeur pour l'index dans le tableau coordDist
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Tri d'un tableau associatif
    Par babelau dans le forum Langage
    Réponses: 1
    Dernier message: 07/02/2014, 08h55
  2. [Tableaux] Tri d'un tableau associatif à 2 dimensions
    Par phpiste dans le forum Langage
    Réponses: 2
    Dernier message: 31/10/2007, 09h24
  3. [Tableaux] Tri d'un tableau associatif
    Par tigunn dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2007, 13h43
  4. [langage] TRI TABLEAU ASSOCIATIF
    Par proner dans le forum Langage
    Réponses: 5
    Dernier message: 04/03/2003, 16h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo