0
votes

Manière rapide de compter et de supprimer des duplicats d'un tableau

J'ai un tableau contenant des doublons xxx

Je veux vous débarrasser des duplicats (insensible au cas insensible) et créer un nouveau tableau qui compte les doublons.

dans l'une des réponses, j'ai vu cette fonction: xxx

qui renvoie deux tableaux: xxx

Il n'est pas insensible à la casse, je veux toute instance de String 1, String 1, String 1, String 1 Pour être considéré comme String 1 . .

Y a-t-il également un meilleur moyen de le faire pour les grandes tableaux? Par exemple, une longueur de matrice de 10k?


0 commentaires

5 Réponses :


2
votes

.sort () code> est un O (n log n) code> processus - si vous besoin em> pour trier les résultats, le faire à la très fin, si la vitesse est quelque chose que vous êtes inquiet. Si vous ne doit pas em> besoin de trier les résultats, utilisez un SET code> (ou une carte code>) plutôt pour vérifier les doublons, au lieu de vérifier une matrice triée pour des éléments similaires dans des indices adjacents.

p>

array = ["String 1", "string 2", "STRING 1", "String 2", "String 3", "String 1"]
function count_array(arr) {
  const result = [];
  const map = new Map();
  for (let i = 0, { length } = arr; i < length; i++) {
    const str = arr[i];
    const lower = str.toLowerCase();
    const currCount = map.get(lower) || 0;
    if (!currCount) {
      result.push(str);
    }
    map.set(lower, currCount + 1);
  }
  console.log([...map.values()]);
  return result.sort();
}
console.log(count_array(array));


4 commentaires

Merci pour l'explication approfondie, votre réponse ne compte pas les articles? Je veux obtenir un deuxième tableau correspondant au nombre de doublons de la matrice 1


Oh, vous vouliez aussi les comptes, utilisez une carte au lieu d'un ensemble pour garder la piste


Est-il possible de les obtenir dans deux tableaux distincts? J'utilise les matrices de retour dans une autre fonction qui accepte deux tableaux différents


Prenez simplement le deuxième élément de chaque tableau sur la carte pour obtenir les comptes correspondants à chaque chaîne.



3
votes

Réduisez la matrice de chaînes à un objet, en utilisant les chaînes comme des clés et le nombre d'apparences en tant que valeurs. Utilisez objet.keys () code> pour obtenir le premier tableau et objet.values ​​() code> pour seconde:

p>

const array = ["String 1", "string 2", "STRING 1", "String 2", "String 3", "String 1"]

const counts = Object.entries(array.reduce((r, s) => {
  const key = s[0].toUpperCase() + s.substring(1).toLowerCase();
  
  r[key] = (r[key] || 0) + 1;
  
  return r;
}, {}))
.sort(([, a], [, b]) => b - a);

const first = counts.map(([s]) => s);
const second = counts.map(([, n]) => n);

console.log(first);
console.log(second);


4 commentaires

Je pense que objet.keys est o (n) donc je ne suis donc pas sûr de la performance sur les grandes tableaux?


Puisque vous avez besoin d'un tableau de n éléments - o (n) est assez bon.


Merci, dans votre réponse, est-il possible de commander du plus grand nombre de comptes en double au plus bas?


Voir les mises à jour. NOTE - La complexité de array.sort () est O (n journal (n))



1
votes

Vous pouvez prendre quelques fonctions et filtrer des valeurs noramlisées avec les compter.

p>

const
    normalize = s => s.toLowerCase(),
    mapCount = (m, k) => m.set(k, (m.get(k) || 0) + 1),
    array = ["String 1", "string 2", "STRING 1", "String 2", "String 3", "String 1"],
    map = array.reduce((m, v) => mapCount(m, normalize(v)), new Map),
    array1 = Array.from(map.keys()),
    array2 = Array.from(map.values());

console.log(array1);
console.log(array2);


0 commentaires

0
votes

Si vous demandez au moyen le plus rapide de le faire, il devrait être fait dans Big-O (N) Asymptotiquement:

  1. Tout d'abord, vous avez besoin d'une carte de hachage pour stocker toutes vos chaînes passées;
  2. Deuxièmement, vous devez itéralement sur votre réseau donné placer ses valeurs dans la carte de hachage;
  3. Enfin, vous devez incrémenter le nombre de la chaîne dans la carte de hachage chaque fois qu'elle est remplie.

    Il peut être mis en œuvre comme: xxx


0 commentaires

0
votes

Ceci peut être fait succinctement à l'aide de array.reduce code> pour créer une carte dont les touches sont les éléments mocassés de votre tableau et que les valeurs sont leur comptage. Ensuite, obtenez les éléments uniques à l'aide de objet.keys () code> et obtenez les comptes avec objet.values ​​() code>:

p>

const array = ["String 1", "string 2", "STRING 1", "String 2", "String 3", "String 1"];

const map = array.reduce((acc, x) => {
  const xLower = x.toLocaleLowerCase();
  acc[xLower] = (acc[xLower] || 0) + 1;
  return acc;
}, {});

console.log(map);
console.log(Object.keys(map));
console.log(Object.values(map));


0 commentaires