-6
votes

JavaScript: Comment puis-je trier des valeurs dans un dictionnaire pour produire des valeurs correspondantes et sortir les valeurs qui ne correspondent pas à un résultat vide

J'ai un ensemble de données comme suit
Gauche: Droite:

1 1
2 2
3 3
5 4
7 6
9 8
1 10

Je veux que la sortie / résultat soit cette
Résultat

1/1
2/2
3/3
- / 4
5 / -
- / 6
7 / -
- / 8
9 / -
10/10

J'ai structuré mes deux ensembles de données dans un dictionnaire

clé: 1, valeur {gauche: 1 droite: 2} etc

Comment puis-je les trier et les associer en fonction de la valeur? Toute aide est appréciée.


5 commentaires

Veuillez ajouter une structure de données à la question et comment les éléments sont écartés à un nouveau jeu de données. Qu'advient-il de 1/10?


Le dernier élément de gauche a-t-il 1 ou un 10?


Les 2 dernières lignes du résultat doivent-elles être de 9 / - et - / 10, il y aurait une certaine logique dans cela?


Le dernier élément de gauche est 10 :)


Stackoverflow .Com / Questions / 12433604 / ...


3 Réponses :


1
votes

// Assuming you have two sorted arrays
left = [1,2,3,5,7,9,10]
right = [1,2,3,4,6,8,10]

let i=0;j=0;
// Assuming you only have to print the result
while(i<left.length && j<right.length) {
  if(left[i] == right[j])
    console.log(left[i++] + ' / ' + right [j++]);
  else if(left[i] < right [j])
    console.log(left[i++] + ' / -');
  else
    console.log('- / ' + right[j++]);
}
while(i<left.length) {
    console.log(left[i++] + ' / -');
}
while(j<right.length) {
    console.log('- / ' + right[j++]);
}


0 commentaires

0
votes

Essayez quelque chose comme ceci:

        Array.prototype.max = function(){
          return Math.max.apply(null, this);
        };

        Array.prototype.min = function(){
          return Math.min.apply(null, this);
        };

        function onlyUnique(value, index, self){ 
            return self.indexOf(value) === index;
        }

        var a1 = [1,2,3,5,7,9,1],
            a2 = [1,2,3,4,6,8,10];
            min = [
                a1.min(), a2.min()
            ].min(),
            max = [
                a1.max(), a2.max()
            ].max(),
            res = [],
            arr = a1.concat(a2).filter(onlyUnique).sort((i1,i2) => i1-i2)

        for(var i=0; i<arr.length; i++){
            var n = arr[i]

            res.push({key: n, value: {
                left:  a1.includes(n) ? n : '-',
                right: a2.includes(n) ? n : '-'
            }})
        }

        console.log(res);


9 commentaires

La complexité temporelle de la solution est très élevée! Si vous avez deux tableaux de longueur M et N, vous faites un nouveau tableau M + N et triez-le! Cela aurait O ((m + n) journal (M + N)) alors que vous pouvez obtenir la solution dans le temps linéaire O (n)


@Dhananjaipai Il y a un bon exemple pour aider JS Débutants Comprendre Comment son travail et comment résoudre le problème étape par étape.


Je suis désolé, mais je prie de différer. Il s'agit d'un exemple trop compliqué qui utilise des fonctions inutilement pour faire une simple compart


@Dhananjaipai C'est une bonne pratique. Votre exemple fonctionne bien mais n'est pas lisible et générera un problème si vous essayez d'ajouter plus de tableaux. Supplémentaire et si / sinon pour chaque tableau? Ce n'est pas une bonne solution.


C'est une mauvaise pratique de mettre à jour le prototype sans nécessaire. Il crée une confusion dans l'équipe si vous utilisez un code JavaScript ou une fonction personnalisée. Mon code est toutefois basé sur l'hypothèse que les matrices sont triées. Je peux toujours donner une solution O (n) même si elle n'est pas triée. Vous n'avez clairement pas lu la clarification à la question que le dernier numéro est en effet 10 et non 1


Et clairement, j'ai mal interprété votre code et la complexité est pire que O ((m + n) log (m + n). Ce serait o ((m + n) ^ 2) puisque vous utilisez un index de l'intérieur d'un filtre. Pour Comparez, si la taille d'origine était de 100 chacune. Votre solution prendrait 200 * 200 = 40000 comparaisons pour générer une sortie. Je peux obtenir la solution avec probablement un peu plus de 100 comparaisons.


LMAO C'est une bonne pratique pour utiliser le prototype dans la langue basée sur les prototypes. Votre code n'est qu'un autre exemple de code difficile qui générait potentiellement des problèmes à l'avenir.


ROFTLMAO, je ne peux manifestement pas savoir où vous obtenez cela, mais vous ne devez pas remplacer les objets standard. Il est basé sur des prototypes et vous pouvez utiliser vos propres fonctions personnalisées et objets pour utiliser les pouvoirs. J'essayais de résoudre le problème à la main. Je peux écrire une solution optimale de toute façon, mais cela ne consiste pas à montrer.


@Dhananjaipai Avez-vous lu ce que j'écris au premier commentaire? C'est un exemple d'aide pour comprendre la logique pour les débutants, ce n'est pas un exemple comment optimiser le code.



0
votes

Quelque chose comme ça pourrait fonctionner, événement, bien que pas parfait: xxx

}


0 commentaires